일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 리리남매
- 최강욱
- 성남 코로나 확진자
- 유튜버 김재석
- 김영권
- 이지혜
- 불가피
- 금리인하
- 학교 개학 연기 4월
- 성남은혜의강교회
- 뭉쳐야 찬다
- 조희연
- 김영권 아내
- 킹덤 고근희
- 임영규
- 제넥신
- 김재석
- 폰폰테스트
- 고민정
- 양적완화
- 홍혜걸
- 이태원 클라쓰 15회 예고
- 스페인 코로나
- 미국 금리인하
- 이상형 만들기
- 은혜의 강 교회
- 픽크루
- 해킹
- libtins
- 스콜피온킹
- Today
- Total
Dork's port
pwnable.kr flag 풀이 본문
안녕하세요! 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
.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 |