Dork's port

pwnable.kr flag 풀이 본문

Pwnable.kr

pwnable.kr flag 풀이

Dork94 2018. 8. 24. 16:28

안녕하세요! 4번 문제입니다. 


생각~보다는 오랜 시간이 걸렸네요.


문제 들어가시죠!


이번 문제의 핵심은 UPX 입니다. 


혹시나 감을 잡지 못해 풀이를 보시는 분이라면 해당 키워드로 다시 고심을 하고 보시길 바랍니다.


먼저, 해당 프로그램을 IDA를 이용해 열어보겠습니다.


main의 코드를 보니 조금 이상합니다. 흔히 알고있는 Stack Frame도 없고 바로 어떠한 함수를 부르는군요.


저 함수로 가보도록 하겠습니다.

LOAD:000000000044A4F0
LOAD:000000000044A4F0                 public start
LOAD:000000000044A4F0 start           proc near               ; DATA XREF: LOAD:0000000000400018↑o
LOAD:000000000044A4F0                 call    loc_44A770
LOAD:000000000044A4F5                 push    rbp
LOAD:000000000044A4F6                 push    rbx
LOAD:000000000044A4F7                 push    rcx
LOAD:000000000044A4F8                 push    rdx
LOAD:000000000044A4F9                 add     rsi, rdi
LOAD:000000000044A4FC                 push    rsi
LOAD:000000000044A4FD                 mov     rsi, rdi
LOAD:000000000044A500                 mov     rdi, rdx
LOAD:000000000044A503                 xor     ebx, ebx
LOAD:000000000044A505                 xor     ecx, ecx
LOAD:000000000044A507                 or      rbp, 0FFFFFFFFFFFFFFFFh
LOAD:000000000044A50B                 call    sub_44A560
LOAD:000000000044A510                 add     ebx, ebx
LOAD:000000000044A512                 jz      short loc_44A516
LOAD:000000000044A514                 rep retn


아래는 loc_44A770 코드입니다.


LOAD:000000000044A770 loc_44A770:                             ; CODE XREF: start↑p
LOAD:000000000044A770                 pop     rbp
LOAD:000000000044A771                 lea     rax, [rbp-9]
LOAD:000000000044A775                 mov     r15d, [rax]
LOAD:000000000044A778                 mov     edx, 0C8h
LOAD:000000000044A77D                 sub     rax, r15
LOAD:000000000044A780                 sub     r15d, edx
LOAD:000000000044A783                 lea     rcx, [rax+rdx]
LOAD:000000000044A787                 call    sub_44A705
LOAD:000000000044A78C                 jb      short loc_44A794


흠.. 역시나 뭔가 이상한 코드 투성이네요. 이때 문제의 설명을 다시 보았습니다.


이때 packed이라는 문자가 걸리더라구요! 아 그래서 이건 packed 파일이구나! 라고 생각 할 수 있었습니다.


Papa brought me a packed present! let's open it.


Download : http://pwnable.kr/bin/flag 


This is reversing task. all you need is binary




또한 sub routine의 내용중 아래와 같은 내용도 있었는데, 아래의 내용으로 UPX로 packing 된 것을 추적할 수 있었습니다.


LOAD:000000000044A693 ; ---------------------------------------------------------------------------
LOAD:000000000044A695 aUpxSfNet       db '//upx.sf.net $',0Ah,0
LOAD:000000000044A6A5                 db 24h, 49h, 64h
LOAD:000000000044A6A8                 dq 2E3320585055203Ah, 7279706F43203830h, 2943282074686769h
LOAD:000000000044A6A8                 dq 30322D3639393120h
LOAD:000000000044A6C8                 db 2 dup(31h), 20h, 74h, 68h, 65h, 20h
LOAD:000000000044A6CF ; ---------------------------------------------------------------------------
LOAD:000000000044A6CF
LOAD:000000000044A6CF loc_44A6CF:                             ; CODE XREF: LOAD:000000000044A693↑j
LOAD:000000000044A6CF                 push    rbp
LOAD:000000000044A6D0                 push    rax
LOAD:000000000044A6D1                 pop     rax
LOAD:000000000044A6D2                 and     [rbp+61h], dl
LOAD:000000000044A6D6                 insd
LOAD:000000000044A6D7                 db      2Eh
LOAD:000000000044A6D7                 and     [rcx+6Ch], al
LOAD:000000000044A6DB                 insb
LOAD:000000000044A6DC                 and     [rdx+69h], dl
LOAD:000000000044A6DF                 db      67h
LOAD:000000000044A6DF                 push    52207374h
LOAD:000000000044A6E5                 db      65h
LOAD:000000000044A6E5                 jnb     short near ptr loc_44A74C+1
LOAD:000000000044A6E8                 jb      short near ptr loc_44A75F+1
LOAD:000000000044A6EA                 db      65h, 64h, 2Eh
LOAD:000000000044A6EA                 and     [rdx+rcx], ah
LOAD:000000000044A6F0
LOAD:000000000044A6F0 loc_44A6F0:                             ; CODE XREF: sub_44A705-D4↑p
LOAD:000000000044A6F0                 add     [rax+6A5E9090h], dl
LOAD:000000000044A6F6                 add     bl, [rdi+6Ah]
LOAD:000000000044A6F9                 add     [rax+0Fh], ebx
LOAD:000000000044A6FC                 add     eax, 6A5F7F6Ah
LOAD:000000000044A701                 cmp     al, 58h
LOAD:000000000044A703                 syscall                 ; LINUX -



UPX를 Unpacking 한 후 IDA를 이용해 연 모습입니다. 401184 주소에 Code Segment의 flag값을 rdx에 옮기는 것이 보이는 군요!

upx unpaking은 upx프로그램을 이용하여 -d 옵션으로 언패킹을 진행하였습니다.


  # Mac OS에서 upx 설치



$ brew install upx


  # Linux 환경에서 upx 설치


$ sudo apt-get install upx




.text:0000000000401164 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:0000000000401164                 public main
.text:0000000000401164 main            proc near               ; DATA XREF: _start+1D↑o
.text:0000000000401164
.text:0000000000401164 dest            = qword ptr -8
.text:0000000000401164
.text:0000000000401164 ; __unwind {
.text:0000000000401164                 push    rbp
.text:0000000000401165                 mov     rbp, rsp
.text:0000000000401168                 sub     rsp, 10h
.text:000000000040116C                 mov     edi, offset aIWillMallocAnd ; "I will malloc() and strcpy the flag the"...
.text:0000000000401171                 call    puts
.text:0000000000401176                 mov     edi, 64h
.text:000000000040117B                 call    malloc
.text:0000000000401180                 mov     [rbp+dest], rax
.text:0000000000401184                 mov     rdx, cs:flag
.text:000000000040118B                 mov     rax, [rbp+dest]
.text:000000000040118F                 mov     rsi, rdx        ; src
.text:0000000000401192                 mov     rdi, rax        ; dest
.text:0000000000401195                 call    _strcpy
.text:000000000040119A                 mov     eax, 0
.text:000000000040119F                 leave
.text:00000000004011A0                 retn
.text:00000000004011A0 ; } // starts at 401164
.text:00000000004011A0 main            endp


그럼 flag 값을 따라가서 보도록 하겠습니다.

.rodata:0000000000496628 aUpxSoundsLikeA db 'UPX...? sounds like a delivery service :)',0
.rodata:0000000000496628                                         ; DATA XREF: .data:flag↓o


위와 같이 Flag의 값이 저렇게 정의되어 있군요! 


그럼 Flag를 입력해주면 flag문제가 완료 됩니다.


처음에 문제 접근 방식을 UPX를 풀기보다는 메모리에 올라올때는 어차피 Unpacking 되거나 malloc을 이용한다는 정보가 있어, 메모리가 할당되고 해제되는 영역을 프로그램 실행 후 종료전에 보려고 했는데 삽질을 하다 실패했네요(사실 문제도 IDA가 아닌 pwndbg를 이용해 풀었는데 IDA 사용법이 미숙해서 연습하기 위해 IDA로 작성하였습니다.)


조금더 깊게 공부하고 나중에 다른 방식으로 풀어볼만한 좋은 문제 였던 것 같습니다.


다음 문제로 귀귀싱!

'Pwnable.kr' 카테고리의 다른 글

Pwnable.kr bof풀이  (0) 2018.08.21
Pwnable.kr col 풀이  (0) 2018.05.29
Pwnable.kr fd 풀이  (0) 2018.05.29
Comments