(리버스 엔지니어링) "hello world!"를 출력하는 C코드 분석
-리눅스 환경
jangeun@jangeun-virtual-machine:~$ vi hello.c
jangeun@jangeun-virtual-machine:~$ gcc -g -o hello hello.c
jangeun@jangeun-virtual-machine:~$ gdb -q hello
Reading symbols from hello...done.
(gdb) list
1 #include <stdio.h>
2 int main(){
3 printf("hello world!\n");
4 }
5
6
7
(gdb) disassemble main
Dump of assembler code for function main:
0x0804841d <+0>: push %ebp
0x0804841e <+1>: mov %esp,%ebp
0x08048420 <+3>: and $0xfffffff0,%esp
0x08048423 <+6>: sub $0x10,%esp
0x08048426 <+9>: movl $0x80484d0,(%esp)
0x0804842d <+16>: call 0x80482f0 <puts@plt>
0x08048432 <+21>: leave
0x08048433 <+22>: ret
End of assembler dump.
-레지스터
ebp: 스택의 시작 주소가 저장(스택의 가장 윗 부분)
esp: 스택의 마지막 주소가 저장(스택의 가장 아랫 부분)
(gdb) break main
Breakpoint 1 at 0x8048426: file hello.c, line 3.
(gdb) run
Starting program: /home/jangeun/hello
Breakpoint 1, main () at hello.c:3
3 printf("hello world!\n");
:main함수에 브레이크 포인트를 건것 break 명령.
3번재 줄인 printf("hello world!\n");에서 실행이 멈춤
(gdb) i r $eip
eip 0x8048426 0x8048426 <main+9>
(gdb) i r eip
eip 0x8048426 0x8048426 <main+9>
eip: 다음에 실행할 명령이 들어 있는 메모리의 번지를 가진다.
0x8048426: 다음에 실행할 명령이 들어있는 메모리 번지
(gdb) x/i $eip
=> 0x8048426 <main+9>: movl $0x80484d0,(%esp)
이 메모리 값에는 mov $0x80484d0,(%esp) 라는 명령이 들어있다.
(gdb) x/i $eip
=> 0x8048426 <main+9>: movl $0x80484d0,(%esp)
(gdb) x/5c 0x80484d0
0x80484d0: 104 'h' 101 'e' 108 'l' 108 'l' 111 'o'
(gdb) x/15c 0x80484d0
0x80484d0: 104 'h' 101 'e' 108 'l' 108 'l' 111 'o' 32 ' ' 119 'w' 111 'o'
0x80484d8: 114 'r' 108 'l' 100 'd' 33 '!' 0 '\000' 0 '\000' 0 '\000'
(gdb) x/s 0x80484d0
0x80484d0: "hello world!"
(gdb) nexti
0x0804842d 3 printf("hello world!\n");
(gdb) i r $eip
eip 0x804842d 0x804842d <main+16>
next : 다음 소스 행까지 응용프로그램을 수행합니다. nexti : 다음 기계 명령어까지 응용프로그램을 수행합니다.
mov==movl
0 개의 댓글