zj3t

email: euntaejang@gmail.com

Latest Posts

(리버스 엔지니어링) "hello world!"를 출력하는 C코드 분석

By 오후 8:43 ,

-리눅스 환경

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>

(gdb) x/i $eip
=> 0x804842d <main+16>: call   0x80482f0 <puts@plt>

next : 다음 소스 행까지 응용프로그램을 수행합니다. nexti : 다음 기계 명령어까지 응용프로그램을 수행합니다.
mov==movl

You Might Also Like

0 개의 댓글