0x.CTF
-
0x22.CODEGATE 2015 - yocto0x.CTF 2018. 10. 31. 17:33
0x22.CODEGATE 2015 - yocto 파일 & 소스 : https://github.com/pwnwiz/CTF/tree/master/yocto 프로젝트를 진행하다보니 linux에 대한 감을 잃는 것 같아 RTDL을 공부할 겸 잡아본 바이너리 였다. RTDL이라는 명칭이 정확한 것은 아니나 eip를 dynamic linker로 re-direct 시킴으로 써 특정 문자열로부터 library의 주소를 얻어와 익스플로잇을 하는 과정을 통칭하는 것으로 return to dl_runtime_resolve라고 칭하기도 한다. dynamic linked 된 바이너리가 실제 함수의 주소를 가져오는 과정을 setvbuf() 함수를 통해 따라가보자. setvbuf의 주소인 0x80482d0으로 들어가면 jmp, p..
-
0x21.teamsik 2016 - StrangeCalculator0x.CTF 2018. 9. 3. 18:42
0x21.teamsik 2016 - StrangeCalculator 파일 & 소스 : https://team-sik.org/ahe16-challenges/ 안드로이드 관련 플젝을 진행하기에 앞서 CTF 문제 하나를 풀어보았다. 메니페스토를 통해 activity는 하나이고, MainActivity부터 분석을 시작하면 된다는 사실을 알 수 있다. 파일의 구조는 다음과 같다. MainActivity, Parser, R 클래스가 존재하는데 그 중에 MainActivity를 들어가보았다. 해당 부분을 보면 사용자로부터 입력받은 값이 v2변수라는 것을 알 수 있는데, 그 값은 Parser에서 eval을 수행한다. Parser를 확인해보았더니, 입력값에 대한 검증 작업을 수행하는데, v2 > 100일 경우에 2가지를..
-
0x20.SSF 2018 - fsb0x.CTF 2018. 8. 14. 15:38
0x20.SSF 2018 - fsb 파일 & 소스 : https://github.com/pwnwiz/CTF/tree/master/fsb 학교 후배가 SSF 동아리의 CTF 문제로 출제한 64bit 포맷 스트링 버그를 풀어보았고, 꽤 재미있었기에 라이트업을 남겨둔다. 포맷 스트링의 익스방법은 32비트와 거의 비슷한데, %lx 또는 %p로 뽑히는 순서에 차이가 있었다. 아이다로 열어보니, main 함수는 간단하게 생겼다. buf에 40바이트만큼을 입력을 받고 printf로 buf를 인자로 넘겨줘서 출력하기 때문에 format string 버그가 발생한다. 다른 부분을 살펴보니 system(/bin/sh)를 수행시켜주는 함수가 있다. 이를 통해 출제자가 이 함수를 사용하여 ret를 변조하거나 got overw..
-
0x19.SSG - phonebook0x.CTF 2018. 8. 1. 23:53
0x19.SSG - phonebook 파일 & 소스 : https://github.com/pwnwiz/CTF/tree/master/phonebook easy phonebook에 이어 다시 phonebook이다. 32비트 바이너리인데 앞과 살짝 다른 구조를 가지고 있다. 이전 문제와 동일하게 버퍼에 입력을 받고 크기를 비교하여 40바이트를 초과하면 40바이트로 할당을 해준다. 전체 전화번호부를 관리하는 청크에는 각각의 전화번호부의 정보를 관리하는 청크의 주소가 있고 관리하는 청크에는 name, phone, birth에 대한 정보가 있다. 2번 메뉴는 %s로 출력을 할 수 있어서 릭이 가능하다. Delete 부분에서는 해당 청크가 힙 영역인지를 확인을 하고 birth, phone, name, 해당 전화번호부..
-
0x18.SSG - easy_phonebook0x.CTF 2018. 7. 29. 14:14
0x18.SSG - easy_phonebook 파일 & 소스 : https://github.com/pwnwiz/CTF/tree/master/easy_phonebook CTF 문제를 풀어본지 하도 오래되서 감도 되찾을 겸 하나씩 풀어보고자 하였고, 동아리 후배의 바이너리 하나를 그 시작으로 선택하여 풀게 되었다. 그래서 그런지 생각보다 많은 시간을 썼다 ㅜ.. 메인 함수의 시작부분을 보면 v2영역에 calloc을 해주는데 그 804b008영역에는 5라는 값이 들어가있었다. 이를 통해서 사용자는 5개의 전화번호부를 등록할 수 있다는 사실을 알 수 있고, v2는 이 할당될 동적 영역들을 관리하는 테이블이라는 사실을 알 수 있다. 이 값은 case 문을 통해서 다른 함수의 인자값으로 넘어간다. 1번 메뉴인 re..
-
0x17.Defcon 2016 - baby-re0x.CTF 2018. 7. 20. 13:12
0x17.Defcon 2016 - baby-re 파일 & 소스 : https://github.com/pwnwiz/CTF/tree/master/baby-re 오늘도 어김없이 앵거를 활용한 문제를 가지고 왔다. 이 문제를 통해 앵거로 함수를 후킹하는 방법을 활용해보았다. 64비트 바이너리였고, 프로그램을 실행시키면 다음과 같은 결과를 확인할 수 있다. scanf가 연속적으로 수행되지 않아 어떤 입력을 넣어도 저렇게 종료되면서 Wrong이 뜬다. 아이다로 까보았더니 여러개의 scanf를 확인할 수 있다. var배열이 [0] ~ [12] 까지를 가지고 있기 때문에 claripy로 int형 변수 13개를 선언해주었다. 그 다음 hook_symbol을 사용하여 scanf에 대한 훅을 걸었는데, 그 과정에서 변수의 ..
-
0x16.ais3 - crackme0x.CTF 2018. 7. 20. 00:41
0x16.ais3 - crackme 파일 & 소스 : https://github.com/pwnwiz/CTF/tree/master/ais3_crackme 이 문제는 바이너리는 간단한데 전에 푼 문제들과 달리 argv를 입력받는 방식이어서 페이로드 부분이 살짝 바꼈다. 바이너리를 확인해보니 verify에서 어떤 루틴을 반복하다가 그 결과가 일치하면 Correct를, 불일치하면 Sorry라는 문구를 출력한다. 이번 문제는 주소값을 주고 찾는 방식이 아닌 lambda 함수를 활용해서 Correct라는 문자열을 찾도록 하였고, 그 과정에서 argv를 30바이트만큼 할당을 하였다. 익스플로잇 코드를 실행시키면 다음과 같이 flag를 확인할 수 있다. 익스플로잇 코드import angr import claripy ..
-
0x15.flareon 2015 - very_success0x.CTF 2018. 7. 20. 00:36
0x15.flareon 2015 - very_success 파일 & 소스 : https://github.com/pwnwiz/CTF/tree/master/very_success 이번 바이너리는 윈도우 바이너리여서 Angr를 사용하기 위해서 특정 부분을 시작지점으로 임의로 지정한 다음, esp에 대한 것을 직접 설정해주어야 했다. 여러 윈도우 함수들이 수행되는 부분을 건너뛰고 필요한 subroutine인 0x401084를 blank_state 옵션으로 시작지점으로 지정해주었다. 서브 루틴이 시작되면서 사용되어야 하는 인자들이 있었기 때문에 windbg를 이용하여 해당 루틴이 진행되는 동안에 esp에 저장된 값들을 살펴보았고, 그 값에 해당되는 부분들을 mem 옵션을 사용하여 세팅을 해주었다. 그 과정에서 e..