gdb로 디버깅 하니 이상한 문자가
글쓴이: Reper / 작성시간: 목, 2013/08/15 - 5:09오후
/* prog.c */ #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char buf[100]; strncpy(buf, argv[1], 100); printf(buf); printf("hello\n"); return 0; }
위 프로그램을 gcc로 컴파일 한 후, gdb로 디버깅하며 밑의 문자열을 삽입합니다.
[reper@localhost reper]$ gdb -q prog (gdb) disas main Dump of assembler code for function main: 0x0804835c <main+0>: push %ebp 0x0804835d <main+1>: mov %esp,%ebp 0x0804835f <main+3>: sub $0x78,%esp 0x08048362 <main+6>: and $0xfffffff0,%esp 0x08048365 <main+9>: mov $0x0,%eax 0x0804836a <main+14>: sub %eax,%esp 0x0804836c <main+16>: sub $0x4,%esp 0x0804836f <main+19>: push $0x64 0x08048371 <main+21>: mov 0xc(%ebp),%eax 0x08048374 <main+24>: add $0x4,%eax 0x08048377 <main+27>: pushl (%eax) 0x08048379 <main+29>: lea 0xffffff88(%ebp),%eax 0x0804837c <main+32>: push %eax 0x0804837d <main+33>: call 0x804829c <strncpy> 0x08048382 <main+38>: add $0x10,%esp 0x08048385 <main+41>: sub $0xc,%esp 0x08048388 <main+44>: lea 0xffffff88(%ebp),%eax 0x0804838b <main+47>: push %eax 0x0804838c <main+48>: call 0x804828c <printf> 0x08048391 <main+53>: add $0x10,%esp 0x08048394 <main+56>: sub $0xc,%esp 0x08048397 <main+59>: push $0x8048458 ---Type <return> to continue, or q <return> to quit--- 0x0804839c <main+64>: call 0x804828c <printf> 0x080483a1 <main+69>: add $0x10,%esp 0x080483a4 <main+72>: mov $0x0,%eax 0x080483a9 <main+77>: leave 0x080483aa <main+78>: ret 0x080483ab <main+79>: nop End of assembler dump. (gdb) break *main+48 Breakpoint 1 at 0x804838c (gdb) run `perl -e 'print "AAAA\x5c\x95\x04\x08AAAA\x5e\x95\x04\x08"';` Starting program: /home/reper/prog `perl -e 'print "AAAA\x5c\x95\x04\x08AAAA\x5e\x95\x04\x08"';` Breakpoint 1, 0x0804838c in main () (gdb) x/60x $esp 0xbfffe660: 0xbfffe670 0xbffffc3d 0x00000064 0x420069e4 0xbfffe670: 0x41414141 0x0495c25c 0x41414108 0x95c25e41 0xbfffe680: 0x00000804 0x00000000 0x00000000 0x00000000 0xbfffe690: 0x00000000 0x00000000 0x00000000 0x00000000 0xbfffe6a0: 0x00000000 0x00000000 0x00000000 0x00000000 0xbfffe6b0: 0x00000000 0x00000000 0x00000000 0x00000000 0xbfffe6c0: 0x00000000 0x00000000 0x00000000 0x00000000 0xbfffe6d0: 0x00000000 0x4000c660 0xbfffe6e8 0x080483b6 0xbfffe6e0: 0x42130a14 0x40015360 0xbfffe708 0x42015574 0xbfffe6f0: 0x00000002 0xbfffe734 0xbfffe740 0x4001582c 0xbfffe700: 0x00000002 0x080482ac 0x00000000 0x080482cd 0xbfffe710: 0x0804835c 0x00000002 0xbfffe734 0x080483ac 0xbfffe720: 0x080483dc 0x4000c660 0xbfffe72c 0x00000000 0xbfffe730: 0x00000002 0xbffffc2c 0xbffffc3d 0x00000000 0xbfffe740: 0xbffffc50 0xbffffc6f 0xbffffc8d 0xbffffc98 (gdb)
0xbfffe675 주소의 0xc2 라는 바이트는 삽입도 하지 않았는데 어떻게 들어간것인가요 ?
저것때문에 공부가 진행이 안되네요. 환경은 레드햇9 리눅스, 커널 2.4 입니다.
Forums:
prog의 파라메터로 입력한 `perl -e
prog의 파라메터로 입력한 `perl -e 'print "AAAA\x5c\x95\x04\x08AAAA\x5e\x95\x04\x08"';`는
``때문에 perl을 통해서 화면에 출력된 후 계산된 결과가 파라메터로 입력되게 됩니다.
따라서 stty -a로 확인되는 터미널의 속성에 따라 반환되는 결과 값은 다소 차이가 있습니다.
특히 0xc2는 터미널 상태에 따라 출력되는 경우도 있네요. 최신 커널과 터미널 환경에서는 0xc2가 삽입되지 않고 정상적으로 출력됩니다.
그리고 도움이 되실지는 모르겠지만
http://geundi.tistory.com/133
를 참고해 보세요. 혹시 원하시는 것이 해킹 관련된 것 같아서요.
포맷스트링버그!
너무 오랜만이라...
댓글 달기