<Wargame & CTF>/Pwnable.xyz 7

[Pwnable.xyz] fclose

fclose #FSOP ![fclose_prob](https://i.imgur.com/E6VL7Mo.png 문제 설명은 다음과 같다. ) 보호기법은 NX 만 걸려있다. 해당 문제는 fclose 함수에서 vtable 을 이용해 특정함수로 jump 하는 특징을 이용하는 문제이다. 소스분석 및 취약점 부분 탐색 int __cdecl main(int argc, const char **argv, const char **envp) { setup(); printf("> ", argv); read(0, &input, 1028uLL); fclose(&input); return 0; }int win() { return system("cat flag"); }중요 소스는 이게 전부이다. 얼핏 보기에도 1028 바이트를 읽어오..

[Pwnable.xyz] note

note #got_overwrite #BOF 바로 들어가보자. 파일은 일반 ELF 파일이다. 별다른 점은 없다. main 함수를 보면 메뉴번호를 고를 때 read_int32 함수를 통해 번호를 전달받는다. 이는 얼마안가서 취약점을 촉발시키는 매개가 되는데, read_int32 함수를 알아보자. 이 함수를 보자마자 눈여겨봐야겠다고 느낀게 문자열 형태의 숫자 를 atoi로 정수 로 바꿔주고 있었기에 얼마나 큰 수를 입력해도 검증과정없이 정수로 바꿔주는 과정이 조금 이상해보였다. 뭐 결론적으론... 좋은 발견이었지만. 그리고 1번 메뉴를 선택하면 edit_note 함수로 들어오는데 모습은 이렇다. 이 부분에서 read_int32 함수의 좋은 기능을 활용할 수 있는데, 일단 s 는 전역배열로 선언되어있는 32바..

[Pwnable.xyz] Game

Game #Pwanble.xyz #Game 오래간만에 포너블 문제를 풀어보았다. 문제 소개로는 감이 안온다. 바이너리를 까보자. 그냥 수학문제 푸는 것 같아보인다. 분석을 해보자. 핵심만 분석해보자면, init_game() 함수에서 현재 문제풀이 상태와 문제푸는 사람 이름을 적어두고 play_game() 함수를 저장하는 cur구조체 를 초기화 한다. 이름은 최대 16바이트, 문제풀이 점수는 8바이트, play_game() 함수를 저장하는데에 8바이트를 써서 구조체는 총 32바이트이다. [play_game()] main() 함수에서 1번 Play Game을 선택하면 cur구조체 안에 있던 play_game() 함수가 실행된다. 이 함수는 별다른 기능은 없고, urandom 파일에 의해 나온 정수 2개를 랜..

[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..

[Pwnable.xyz]add, misalignment

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

반응형