본문 바로가기
Security/[게임] CTF 풀이

[Reversing] DEFKTHON 2014 Reversing200

by blackcon 2014. 3. 5.

 실행시키면 입력값을 받고 죽는 바이너리. 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