write up/hackingcamp22CTF
hackingcamp22CTF - dvm-rev
heegong
2021. 3. 20. 19:10
728x90
문제
dvm-rev
sub_14A3이 가장 중요한 함수다.
이러한 함수다.
ida 리모트 디버깅을 쓴다.
인자로는 opcode를 준다.
f9를 누른다.
jmp rax가 굉장히 중요하다.
아무거나 입력해준다.
call하는 부분으로 오게 된다.
안은 이러했다.
memcmp로 가는 것을 볼 수 있다.
unk_7F4ABDDDFF00 = memcmp
끝나고 rsi 주소로 가보면
여기 주소와 비교하는거다.
코드를 패치하여 검사를 통과하도록 만들었다.
총 3번 입력받는다.
opcode : S가 출력되면
입력을 받는다.
opcode : P가 출력되면
memcmp를 호출한다.
RAX값을 보니 8개를 입력받는 것을 알 수 있다. (read 함수 호출 후)
여기를 보면 sub_1100는 write함수로 이동하는 함수라고 알 수 있다.
여기 보이는
이 부분을 memcmp로 가게 하지 말고 write함수로 가게 만든다.
jz를 jnz로 바꿔서 실패가 없도록 만든다.
pwntools를 이용해 브포를 돌리면 된다.
hxd로 바꿔줬다.
(wsl ubuntu 18.04 python 2.7 환경)
from pwn import *
memcmp_ls = [b"\\x9A\\x03\\x8A\\xF0\\x89\\xDC\\x25\\x93", b"\\xB2\\xCA\\x48\\xB2\\x86\\x91\\xE4\\xF9", b"\\x26\\x4F\\x11\\xD8\\x8F\\xA6\\x5F\\x6D"]
result = ''
for i in range(3):
for j in range(8):
for brute_force_c in range(0x7e+1):
p = process(['dvm-rev_1_hx','opcode'])
p.sendline(result+chr(brute_force_c))
for k in range(i+1):
p.recvuntil("[+] opcode : P\\n")
recv_data = p.recv()
p.close()
if recv_data[j]==memcmp_ls[i][j]:
result+=chr(brute_force_c)
break
print(result)
HCAMP{34sYrEvPrObl3m:-)}