Hello, Stranger

[Reversing] DEFKTHON 2014 Reversing200 본문

CTF & War game/CTF 풀이

[Reversing] DEFKTHON 2014 Reversing200

blackcon 2014.03.05 00:11

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






저작자 표시
신고
0 Comments
댓글쓰기 폼