Description

Category: Pwnable

Source: HackCON CTF 2019

Points: 469

Author: Jisoon Park(js00n.park)

Description:

I just read and write , Can you still Pwn me ?

Service is running at nc 68.183.158.95 8992

Download: q4

Write-up

1KB도 안되는 크기의 바이너리가 주어지는데, disassemble을 해보면 거의 main 함수밖에 없고 shared library도 사용하지 않아서 ROP를 할만한 gadget이 보이지 않는다.
(주어진 원본 바이너리에서는 sys_read를 위한 fd가 1로 되어있어서 입력을 줄 수 없었는데, 서버에서 동작하는 바이너리를 보니 입력을 받는 것 같아서 binary patch를 통해 fd를 0으로 수정하였다.)

.text:00000000004000BF ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00000000004000BF main            proc near               ; CODE XREF: _start↑p
.text:00000000004000BF                 push    rbp
.text:00000000004000C0                 mov     rbp, rsp
.text:00000000004000C3                 sub     rsp, 10h
.text:00000000004000C7                 mov     eax, 0
.text:00000000004000CC                 mov     edi, 0          ; fd
.text:00000000004000D1                 mov     rsi, rbp
.text:00000000004000D4                 sub     rsi, 10h        ; buf
.text:00000000004000D8                 mov     edx, 0A0h       ; count
.text:00000000004000DD                 syscall                 ; LINUX - sys_read
.text:00000000004000DF                 mov     eax, 1
.text:00000000004000E4                 push    1
.text:00000000004000E6                 pop     rdi             ; fd
.text:00000000004000E7                 syscall                 ; LINUX - sys_write
.text:00000000004000E9                 leave
.text:00000000004000EA                 retn
.text:00000000004000EA main            endp

checksec을 해보면 RWX를 할 수 있는 영역이 존재하는 것을 알 수 있는데, shell code를 올릴 수 있는 방법이 있을지 생각해 봐아 할 것 같다.

바이너리를 실행시키고 메모리맵을 보면 0x600000 번지에 0x1000 크기의 RWX 영역이 존재하는 것을 볼 수 있다.

RWX에 shellcode를 써주고 rbp와 rsp를 모두 이쪽으로 옮겨보자.

sys_read의 대상이 되는 buffer가 rbp - 0x10 주소로 지정되기 때문에 RWX 영역에 shellcode를 쓰기 위해서는 rbp를 먼저 옮겨야 한다. (rsi를 쓸 수 있는 적당한 gadget이 있으면 좋을 텐데 그런거 없다..)

간단히 bof를 이용하여 rbp가 RWX 영역을 가리키도록 한 후 다시 main 함수로 복귀하여 sys_read를 호출하면 RWX 영역에 shellcode를 쓸 수 있다.
rbp를 변조했기 때문에 main 함수로 복귀할 때는 prologue 이후의 주소로 돌아가면 된다.

두 번째 main 함수의 실행 후에는 RWX 영역에 지정해줬던 rbp로부터 pop이 진행되기 때문에 RWX 영역의 rbp 다음의 return address 부분 이후에 shellcode를 써주고 return address 부분에 shellcode가 들어간 주소를 써주면 shellcode가 실행되면서 shell을 획득할 수 있다. (코드)

Flag : d4rk{5uch_R0P_MuCh_W0W}c0de

'writeups > Pwnable' 카테고리의 다른 글

Not So Easy B0f  (0) 2019.11.26
nothing more to say  (0) 2019.11.26
speedrun-002  (0) 2019.11.26
horcruxes  (0) 2019.11.26
shellql  (0) 2019.11.26

+ Recent posts