실행시키면 입력값을 받고 죽는 바이너리. Segmentation Fault가 뜨는데 그냥 puts로 개발자가 출력하는거더라구요...ㅋㅋㅋ 그럼 분석 ㄱㄱ
위의 이미지는 main의 전체적인 부분이고 핵심은 아래 이미지입니다.
pipe()로 무엇인가와 연결을 한 뒤 fork()를 호출합니다. fork()함수는 자식 프로세스를 생성하는데 부모프로세스에서와 자식프로세스에서의 fork()의 리턴값은 다릅니다. 부모에서 fork()를 하면 return값은 자식프로세스의 Process ID이고, 자식프로세스는 0을 리턴합니다. 즉, 자식프로세스로 진행을 한다면 if( !v4 )에서 이 부분에서 프로그램이 죽습니다.
죽기전에 하는일이 있는데 write를 이용해서 '42447255344574653276838751'를 입력하고 자식프로세스에서 입력한 문자열은 부모에서 read(v2, &v6, 0x1d)로 받습니다. 자식->부모로 값을 전달했다고 보면 되요!!
그리고 마지막 분기문가기전에 scanf로 입력을 받는데 이 입력값과 자식프로세스의 Process ID가 같으면 if( v5 == v4)가 성립되므로 답이 있는 곳으로 향할 수 있습니다 :D
그럼 부모프로세스에서 디버깅 ㄱㄱㄱ
fork()를 호출한 후 멈춘 장면인데 eax값을 보면 0x9dc(2524)인 것을 볼 수 있는데 이건 자식 프로세스의 Process ID입니다.
자식이 보낸 값을 부모의 read()로 받음
scanf에서 자식프로세스값을 입력해줌.
모든 분기문의 조건문을 만족하고 lol함수로 들어갈 수 있습니다. 들어갈때 인자로 "424472~~"를 넘기네요!
lol함수 내부로 들어왔는데 너무 길어서 다 첨부하진 못햇네요,...ㄷㄷ
무튼 특정자리의 값 2개를 읽어서 두 수를 더한 후 다른 문자로 저장을 하는데 이 루틴대로 코드를 작성하면 flag가 나와여 :D
'Security > [게임] CTF 풀이' 카테고리의 다른 글
[Network] backdoor2014 MISC10 writetup (0) | 2014.03.24 |
---|---|
[Network] RuCTF2014 bluetooth writeups (0) | 2014.03.11 |
[Reversing] DEFKTHON 2014 Reversing100 (0) | 2014.03.04 |
[MISC] DEFKTHON 2014 MISC200 (0) | 2014.03.04 |
[exploit] Sharif CTF 2013 exploiting 200 (0) | 2014.02.27 |