<Wargame & CTF> 42

[Pwnable.xyz] UAF

UAF #pwnable.xyz #not UAF #overwrite #heap 배점에 비해 쉬웠던 문제. 핵심만 언급하려한다. 결론적으로 본 문제는 UAF를 이용하지 않아도 된다. UAF로 풀이하는 루트도 있을런지는 모르겠지만 필자는 그냥 overwrite를 이용해서 문제를 풀었다. 바이너리의 기능은 총 5가지이다. 게임을 시작하거나, 저장하거나, 지우거나, 게임이름을 출력하거나, 게임 이름을 수정하거나... 여기서 게임은 단순히 두 숫자를 받아서 xor한 값을 특정 heap영역에 저장하는 행동을 한다. 이 문제의 목표는 win 함수를 실행 시키는 것 같다. 우선 IDA로 보면 바이너리 실행직후, initialize_game 함수를 통해 특정 heap영역과 data영역을 구성한다. 구조는 대략 이러하다. ..

[Pwnable.xyz] GrownUp

GrownUp #pwnable.xyz #baby_fsb 오랜만에 pwnable.xyz 를 하였다. 몸풀기로 낮은 점수의 GrownUp 문제를 풀어보았다. 플래그는 바이너리에 내장되어있다고 한다. 바이너리 문자열을 검색해보면 진짜로 플래그 (물론 페이크 플래그)가 내장되어있다. 0x601080 이 주소를 기억하라. PIE가 적용되어있지 않아서 이 data영역의 주소는 서버에서도 동일하게 매핑되어있을 것이다. 바이너리 실행결과는 이렇다. 봐야할 주요부분은 main함수이다. 처음에는 setup 함수가 실행된다. setup 함수는 ... data영역의 0x601160 부분에 %s\n 문자열을 넣는다. 후에 0x601160은 main함수의 printf의 서식문자로 이용된다. 그리고 y or N에 대한 응답을 re..

[System32.kr] Warm Up

Warm Up #pwnable #system32.kr #file descriptor 새로운 워게임 사이트를 찾았다! 암호학 위주여서 매우 관심이 간다 ㅎㅎ 첫 단추를 어떤 문제로 풀어볼까 하다가 Warm Up 이라는 pwnable 문제를 찾았다. 파일 디스크립터를 이용하는 문제 같다. 처음에는 파일 디스크립터를 overwrite 하는 종류의 문제인가 했으나 의외로 간단했다. 다만 strip 이 적용된 상태라 glibc 함수들을 일일히 인지하고 복구하는 과정에 약간의 난항이 있다. 우선 위처럼 메뉴가 주어지고 특정 파일을 open하고 읽거나 삭제할 수 있다. 디컴파일 해보니 31337 이라는 숨겨진 커맨드가 있었다. 이 함수는 /home/strange_file/flag 파일내용을 임의의 string 테이블..

[Pwnable.kr]shellshock

https://namu.wiki/w/%EC%85%B8%EC%87%BC%ED%81%AC 셸쇼크 - 나무위키 본격적으로 설명하기에 앞서 Bash의 환경변수에 대해 간략하게 알아보자. $ hi="안녕!" $ echo $hi 안녕!hi라는 변수를 생성, echo 함수를 통해 출력하는 구문이다. $hi를 입력했을 때 Bash shell은 c의 매크로처럼 "안녕!"이라고 변환해준다. $ hi="안녕!" $ export hi $ printenv | grep hi hi="안녕!"이번엔 변수를 선언하고 export를 통해 환경변수에 등록해보자. printenv로 환경변수 목 namu.wiki 꺼무위키에 설명이 잘 나와있었다. 취약점의 종류는 CVE-2014-6271 이다. bash에 대한 놀라운 소식이 있단다 ;; (s..

[Pwnable.kr]input

문제는 이렇다. 힌트가 될만한 건 없어보임. 들어가기에 앞서서, 이 문제는 pwntools의 소소한 사용법들을 많이 익힐 수 있었던 문제이다. 접속 후에 파일 목록을 보면 이렇다. C 소스를 주었다. 그 전에 우선 input 바이너리를 실행시켜보자. 문제에서는 프로그램에 input을 올바르게 넣으면 플래그를 준다고 한다. C소스를 보러가자. 우선 소스 맨 아래에 flag를 출력 시켜주는 함수 구문이 있다. 여기에 도달해야하는게 최종목표이다. 도달하기 까지 총 5단계의 과정이 있다. 첫 번째 단계이다. 바이너리에 argv 인자의 형태로 input을 잘 넣을 수 있는지 보는 과정이다. 우선 인자의 개수는 바이너리경로 포함 100개의 argv를 갖고있어야한다. (argc != 100) 그리고 argv['A']..

[Reversing.kr]ImagePrc

그래픽 관련 Windows API 를 공부할 수 있었던 문제이다. 그림을 그릴 수 있는 프로그램이 나오고 아무거나 그려서 Check를 누르면 틀렸다고 나온다. IDA로 디컴파일을 해보았다. WinMain 함수를 보면 메세지를 처리할 것만 같이 생긴 WndProc 함수가 나온다. (여담이지만 예전에 API 문제는 WndProc을 찾자는 공식(?)을 외웠던 것 같다...) 그리고 WndProc 내부를 살펴보면 bitmap 이미지를 다루는 함수들이 보인다. 우선 CreateCompatibleBitmap으로 가로 200 세로 150의 이미지 핸들(?)을 만들고CreateCompatibleDC 로 메모리핸들을 만든다. 그 후에 hdc에 가로 200 , 세로 150의 비트맵 이미지를 옮기고 BitBlt 함수로 윈도..

[Reversing.kr]Replace

바이너리를 실행시켜보면 아무거나 입력할 수 있는 창이 나온다. 아무거나 입력하고 Check 했더니 즉시 꺼져버렸다... ';;; IDA에 올려보도록 하겠다. WinMain 함수를 어렵지 않게 찾을 수 있었다. WinMain 에선 단서가 될 만한게 안보여서 string 을 검색한 결과 "Correct!" 라는 string이 있는 곳을 발견했다! 그와 동시에 DialogFunc 에서 거의 모든 action이 일어난다는 것을 알 수 있었다. 그리고 DialogFunc에서 메인역할을 하는 것 같은 sub_40466F 함수가 디컴파일이 잘 안된다는 것을 발견할 수 있었다. (alt + k 로 스택포인터 변경 불가) 아마 call 부분에서 정확한 주소가 아닌 오프셋을 5 추가한 부분을 call 하기 때문인 것 같다..

[Pwnable.xyz]add, misalignment

add, misalignment 둘 다 비슷한 성격의 문제라서 같이 쓴다. add 바이너리를 IDA에 올리면 main함수에 다른 사족은 제외하고 while 문 하나를 볼 수 있다. 요약하면 숫자 3개를 받아서 첫번째와 두번째 숫자를 더하여 array의 세번째입력 숫자 값의 인덱스에 저장하고 출력하는 로직이다. 플래그를 얻어낼 수 있는 함수는 win() 함수! 주소는 0x400822 10진수 정수로는 4196386 이다. 이제 단서들을 모았으면 어떻게 main함수에 없는 win 함수를 실행할 수 있을지 고민해보자. 고민하다보니 원래크기인 array[11]을 벗어나서 [-1] , [12] , [13] , .... 까지 입력이 가능하다는 것을 발견할 수 있었다. 지역변수들을 고려하여 스택 구조를 파악하면 ar..

[Reversing.kr]Music_Player

mp3를 재생시킬 수 있는 Music Player 가 있고 1분 미리듣기 기능이 디폴트로 설정되어있다.1분 제한 기능을 우회하면 플래그가 나온다고 써져있다. 며칠동안 고생했던 문제... 확실히 배운 점도 있다. 1. 이런 류의 문제는 ms 단위로 시간을 책정하는 편.2. IDA로 VB 디버깅 하는 법3. 삽질 능력 등등.... 우선 프로그램을 켜서 아무노래나 재생시키면 1:00 이 되자마자 MsgBox를 띄운다. VB는 올리가 편해서 처음에는 OllyDbg 로 깠는데 이상하게 파일 여는 과정에서 자꾸 오류를 뿜어서 어쩔 수 없이 IDA로 디버그를 진행하였다. (해보니까 올리보다 편했다는 후문! ) 일단 MsgBox를 call 하는 부분을 크로스레퍼런스로 조사 후에 다 브레이크를 걸어놓고진행시켰더니 위의 ..

[Reversing.kr]Easy Unpack

문제의 목적은 바이너리의 OEP(Original Entry Point) 를 구하는 것이다. 처음에 문제 제목을 까먹고 PE View에 나와있는대로 OEP를 적었다가 틀렸다 .. :) ;; ㅋㅋㅋㅋㅋ (Packing 된 상태의 OEP) OllyDbg 에서 search for all intermodular calls를 했더니 함수가 얼마 나오지 않는 것으로 미루어 짐작하면 패킹이 되어있음을 확실히 알 수 있다. 패킹 방식은 보다시피 나오지않는 유명하지않은 패킹 방식인듯 하다. 그러면 이제 생각할 것은 매뉴얼 언패킹을 시도하는 것이다. 확신할 수 있는 것은 패킹된 바이너리도 실행할 때에는 분명히 패킹으로 인해 변조된 OEP가 아닌본래의 OEP를 거쳐서 프로그램을 실행한다는 점이다. 우리는 그 점에서 매뉴얼 언..

반응형