본 문제는 pwnable.kr를 통해서 풀어 보실 수 있습니다.

해답을 이해하며 생각을 해보면서 풀이 해보시길 바랍니다.

문제 내용

문제는 pwnable.kr를 들어가시면 확인할 수 있습니다.

아빠가 Packing된 선물은 가져왔다는데 열어보랍니다 !

이번에 리버싱 과정이라는데 어떤 의미일지 확인해보겠습니다!

wget 명령어로 각 파일을 다운 받고 flag를 실행해보려합니다.

malloc() 함수와 strcpy()함수로 플래그를 가져온다는 데 pwndbg로 확인해보겠습니다.

문제 풀이

Main 함수의 어셈블리

Main을 가져오지 못했다? file flag를 해본다.

flag: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, no section header

분명 ELF 파일인데 왜 안되는거지? checksec flag로 무슨 보호 기법이 사용 되어 있는지 확인해본다.

Checksec Flag

모든 보호 기법이 해제되어있고, 처음보는 UPX로 패킹 되어 있다고 한다.

UPX가 무엇인지 부터 확인해야 할 것으로 보인다.

UPX 패킹

UPX(Ultimate Packer for eXecutables)는 여러 운영체제에서 수많은 파일 포맷을 지원하는 오픈 소스 실행 파일 압축 프로그램이다. GNU 일반 공중 사용 허가서를 통해 공개된 자유 소프트웨어이다. 압축, 압축 해제의 기능을 모두 담당한다.

패킹은 파일의 크기를 줄이기 위해 압축하는 것을 말한다. 파일의 코드를 숨기기 위해 패킹을 하기도 한다. UPX는 패킹 도구 중 하나다.

apt install upx
upx -d flag
  • 이 UPX 패키지를 설치하여 UPX 언패킹을 진행해본다.

  • 언패킹이 성공적으로 되었고, 파일의 크기가 증가한 것을 볼 수 있다. 다시 pwndbg를 이용해서 disassemble 해본다.

  • 결과가 제대로 나오는 것 같으므로, 이제 하나씩 진행해보면서 알아보려 한다.

  • 보이는 것으로는 puts(), malloc(), call 0x400320가 보인다.

puts(), malloc()

  • mov edi, 0x496658 이후 call을 이용해서 맨 처음 ./flag 했던 값이 나오는 것을 알 수 있다. 즉, 0x496658에는 해당 문자열이 담겨 있는 것을 알 수 있다.

  • mov edi, 0x64 이후 malloc() 함수를 호출 하는 것으로 보아 malloc(0x64)로 진행되는 것이다.

After

First. [rbp-8]에 rax가 가진 값을 넣는다.

Second. rdx[rip+0x2c0ee5]값을 넣는다.

?… rdx에 FLAG 같은 값을 넣었다? 일단 이것이 FLAG 값이라고 점 찍어두어야 할 것 같다.

Third. rsirdx값을 넣고, rdirax값을 넣는다.

그렇다면 rsi에는 위 FLAG 같은 값이 들어가고 rdi에는 1번의 값이 들어 갈 것이다. 이후 CALL까지 진행하면 RAX에도 FLAG 값이 들어가는 것으로 보니 0x400320가 strcpy()이다.

후기

어쩌다가 FLAG 값을 찾은거 같은데 아무리 생각해도 이게 무슨 풀이인지 모르겠다.

단순 UPX 패킹을 알려주기 위한 문제인지 확신이 서질 않는다.

따라서, 다른 사람의 풀이를 보면서 더 들여다 보면서 공부해야 할 것 같아서 다른 분의 풀이를 링크로 남기겠습니다!