본문 바로가기

IT(개발, 보안)/pwnable

[Pwnable 풀이] 6. flag

혹시나 모르시는 분들을 위해 말하자면 문제의 번호는 제가 푼 순서이므로 무작위로 그 때 그 때 정해집니다...ㅎ

 

 

이번 문제는 reversing 문제라고 친절하게 설명도 나와있다. 리눅스 시스템에서 사용해야하는 프로그램들이 필요하므로 virtualbox에 리눅스를 설치하고 풀이를 진행했다.

 

wget 명령어를 사용해 해당 파일을 다운받고 file 명령어로 파일의 정보를 확인했다. ELF 파일은 리눅스 시스템의 실행파일 포맷이다. 그래서 실행가능하게 파일을 변경하고 실행해보니 위와 같은 출력이 나타났다.

malloc에다 flag값을 넣어놨다고 하니 gdb를 통해 메모리 주소를 확인해보려 했으나 디버깅이 정상적으로 실행되지 않았다. 그래서 머리를 굴려보다 바이너리 파일의 헤더를 살펴보기로 했다.

 

HxD라는 바이너리 뷰어를 사용해서 확인해보니 ELF 파일이라는 정보와 UPX 라는 정보를 확인해 볼 수 있었다. UPX는 운영체제에 무관하게 사용가능한 압축 포맷으로 해당 압축을 풀면은 디버깅이 가능해 보였다.

 

리눅스에 apt-get install을 사용해 upx를 다운받고 upx -d 명령어로 flag 파일의 압축을 해제하니 gdb를 정상적으로 사용할 수 있었다.

 

disas main 명령어로 메인 함수의 어셈블리어를 확인해 보였다. 분명 수업시간에 어셈블리 해독하는 걸 열심히 배웠었는데 여전히 어려워 여기서 많이 헤맸다.

 

레지스터 앞에 %가 붙어있어 AT&T 문법임을 확인할 수 있고 이는 나한테 익숙한 Intel 문법과 순서가 반대였다. 

 

4번째 라인의 edi 레지스터에 주소값이 넣어지고 다음 라인에서 puts 함수가 호출 되었다. 때문에 0x496658 메모리에는 출력될 문자열이 저장되고 있음으로 추측되어진다.

 

6번째 라인에서는 edi에 0x64 주소가 저장되고 다음 라인에서 malloc 함수가 call 되어진다. 그 다음 8번과 10번 라인은 rax와 rbp를 초기화 하는 라인으로 보이는데 그 이유는 잘 모르겠고...(혹시 아신다면 댓글 부탁드립니다) 중요한건 9번 라인이다.

 

9번라인에서 rdx에 0x2c0ee5(%rip)를 저장하고 있다. 여기서 rip 레지스터엔 다음에 실행할 명령어의 주소를 저장하는데 9번라인이 0x401184이니 rip에 저장된 값은 10번 라인, 즉 0x40118b의 값이 들어가 있다. 그렇다면 0x2c0ee5(%rip)는 2c0ee5에 rip의 값의 더한 값을 나타내기 때문에 0x6c2070, <flag>의 주소를 나타낸다.

 

윈도우 계산기의 프로그래머 기능인데 아주 유용하게 잘 쓰고있다. 그래서 0x6c2070에 저장된 값을 살펴보면 little endian으로 0x496628이 저장된 것을 확인할 수 있고 해당 주소에 저장된 문자열을 확인하면 flag 값을 확인 할 수 있다.

반응형

'IT(개발, 보안) > pwnable' 카테고리의 다른 글

[Pwnable 풀이] 8. passcode  (0) 2022.11.28
[Pwnable 풀이] 7. bof  (0) 2022.11.20
[Pwnable 풀이] 5. cmd1  (0) 2022.11.15
[Pwnable 풀이] 4. shellshock  (0) 2022.11.10
[Pwnable 풀이] 3. coin1  (0) 2022.11.09