SECURITY/REVERSING

์–ด์…ˆ๋ธ”๋ฆฌ์–ด ๋ถ„์„ 1 - example 1

\b\t 2020. 7. 14. 17:53

* ์ด ๊ฒŒ์‹œ๊ธ€์€ AT&T ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

(AT&T ์™€ Intel ์ฐจ์ด ์ฐธ๊ณ -

2020.07.08 - [SECURITY/REVERSING] - REVERSING ์‹œ์ž‘ํ•˜๊ธฐ - ๊ธฐ์ดˆ ๊ฐœ๋… 4 :: ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด )

 

๋ถ„์„ํ•  ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

.file	"example1.c"
.section	.rodata
.LC0:
.string	"Hello world"
.text
.globl	main
.type	main, @function
main:
.LFB0:
.cfi_startproc
pushq	%rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq	%rsp, %rbp
.cfi_def_cfa_register 6
movl	$.LC0, %edi
movl	$0, %eax
call	printf
movl	$0, %eax
popq	%rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size	main, .-main
.ident	"GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
.section	.note.GNU-stack,"",@progbits

 

 

๋จผ์ €, ์ด ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋Š” AT&T ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๋จผ์ €, . (์˜จ์ ) ์€ "current location" ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

ํ•œ ์ค„์”ฉ ์‚ดํŽด๋ณด๋ฉด,

 

 

.file : (์ผ๋ฐ˜์ ์œผ๋กœ) ๋””๋ฒ„๊ฑฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์›๋ณธ ์†Œ์Šค ํŒŒ์ผ ์ด๋ฆ„

 

.rodata ์„น์…˜ ์ •์˜ : ์ด ์„น์…˜์€ ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ ๋ณ€์ˆ˜์ด๋‹ค

 

LC0 ๋ณ€์ˆ˜์— ์˜ํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” "Hello world" ๋ฌธ์ž์—ด

 

.text ์„น์…˜ : ์ƒˆ๋กœ์šด section ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, text section ์€ ์ฝ”๋“œ๋“ค์„ ์ €์žฅํ•œ ์„น์…˜์ž„

 

main ํ•จ์ˆ˜ ์ •์˜. main: ์ด ์‹œ์ž‘์ด๊ณ , ret ์ด main ํ•จ์ˆ˜์˜ ๋์ด๋‹ค. 

 

 

 

.LFB0 : ํ•จ์ˆ˜์˜ ์‹œ์ž‘์„ ์˜๋งˆํ•˜๋Š” "local label"

 

.cfi_startproc : "call frame information" . ์–ด์…ˆ๋ธ”๋Ÿฌ์—๊ฒŒ dwarf format ๋””๋ฒ„๊น… information ์„ ๋งŒ๋“ค๋„๋ก? ์ง€์‹œ

 

pushq % rbp : ํ•จ์ˆ˜ ํ”„๋กค๋กœ๊ทธ.

ํ˜„์žฌ์˜ rbp (๋ฒ ์ด์Šค ๋ ˆ์ง€์Šคํ„ฐ) ๊ฐ’์„ ์ €์žฅ (Stack ์— push) 

(* 64 bit ํ™˜๊ฒฝ์—์„œ๋Š” esp / ebp ๊ฐ€ ํ™•์žฅ๋˜์–ด rsp / rbp ๊ฐ€ ๋œ๋‹ค.)

๋”๋ณด๊ธฐ

(esp ๋Š” ํ•จ์ˆ˜ ๋™์ž‘ ์ค‘์— ๋ณ€๊ฒฝ๋  ์ˆœ ์žˆ์ง€๋งŒ, ebp ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€

2020/07/08 - [SECURITY/REVERSING] - REVERSING ์‹œ์ž‘ํ•˜๊ธฐ - ๊ธฐ์ดˆ ๊ฐœ๋… 4 :: ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด)

 

 

.cfi_def_cfa_offset 16
.cfi_offset 6, -16


movq %rsp, %rbp : ํ•จ์ˆ˜ ํ”„๋กค๋กœ๊ทธ.

rsp ๋ฅผ rbp ๋กœ ์ด๋™ (๋ฒ ์ด์Šค ๋ ˆ์ง€์Šคํ„ฐ = ์Šคํƒ ํฌ์ธํ„ฐ ;)


.cfi_def_cfa_register 6

movl $.LC0, %edi : edi ๋ ˆ์ง€์Šคํ„ฐ์— LC0 ๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฌธ์ž์—ด ์ €์žฅ
movl $0, %eax : eax ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฆฌํ„ด๊ฐ’ 0 ์ €์žฅ

call printf : ํ•จ์ˆ˜ prinf ์ฝœ
movl $0, %eax : eax ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฆฌํ„ด๊ฐ’ 0 ์ €์žฅ


popq %rbp  : ํ•จ์ˆ˜ ์—ํ•„๋กœ๊ทธ.

leave. ํ•จ์ˆ˜ ์ „์˜ rbp ๋ฅผ ๊ฐ€์ง€๊ณ  ์™€์„œ rsp ๋ฅผ ๋‹ค์‹œ ์„ค์ •

 

.cfi_def_cfa 7, 8


ret : ํ•จ์ˆ˜ ์—ํ•„๋กœ๊ทธ. ํ•จ์ˆ˜ ๋ !

 


.cfi_endproc : ํ•จ์ˆ˜ ๋


.LFE0 : local label
.size main, .-main

 

 

์ฃผ์–ด์ง„ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ c์–ธ์–ด๋กœ ์ˆ˜์ •ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

#include <stdio.h>

int main() {
    printf("Hello world");
    return 0;
}
๋Œ“๊ธ€์ˆ˜0