본문 바로가기

CAT-Security/미분류

[Codegate2014] dodoCrackme_200










프로그램은 다음과 같이 64-bit elf파일이며 stripped가 걸려 있습니다.




실행을 했을 떄 입력을 받으며 Permission denied을 출력하며 프로그램이 종료 됩니다..






strace로 확인 했을 때 write와 와 read가 보임을 확인 할 수 있습니다.






IDA 64로 열어봤을 때, 이러한 루틴이 반복됨을 확인했고, 증가 된 값을 메모리 어딘가에 저장을 합니다.

반복되었기 때문에 찍히는 문자열을 보았고, 키값이 나왔습니다.






허나 이 방식은 제대로 된 풀이 방법이 아니기 때문에, 타 블로그에 있는 정상적인 방법을 쓰겠습니다.

출처 : http://pwnbit.kr/42






write의 경우 호출값은 1이며 read는 0 입니다.

다음은 64bit 환경 리눅스에서 read 및 함수들이 어떻게 호출 되는지 볼 수 있는 사이트 입니다.

linux system call table for x86-64 : http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64


 




다음과 같은 형식으로 호출 됨을 확인 할 수 있습니다.





mov     eax, 0 (mov 띄어쓰기 다섯번)

0x4065C0의 주소값에서 read함을 알 수 있습니다.






read()에 break point를 걸고, 200개만큼 cw로 출력을 하니 키값이 나옴을 확인 할 수 있습니다.

이것의 경우 ebp 기준으로, 바로 밑에 char key="H4PPY_C0DEGaTE_2014_CU_1N_K0RE4" 식으로 되어있을 것 입니다.


블로그의 작성자는 read()함수를 쓸때 ebp값을 보게 되면 어딘가에서 비교할테니 값을 출력 할것이다 라고 생각을 했는데,

내 생각은 조금 다르다, 어차피 이 프로그램은 사용자 정의함수등이 따로 구현되어 있는것 같지가 않습니다.

그 증거로 break point를 거의 맨 아래부분인 b *0x040b744 에 걸고 x/200cw $rbp를 해도 키값이 출력됨을 확인 할 수 있습니다.


즉 그렇다면 단순히 프로그램내에서 ebp와 멀지않는 곳의 키값을 출력하는것이 핵심 인 것이고,

read의 주소값을 굳이 확인하지 않더라도 프로그램이 끝나가는 부분이라던지 어느 지점부분에서 ebp를 출력하면 키값을 확인 할 수 있을 것 입니다.




'CAT-Security > 미분류' 카테고리의 다른 글

[PlaidCTF 2013] three eyed fish_100  (0) 2014.05.16
[CSAW CTF 2012] Reversing_400  (0) 2014.05.15
[Reversing.kr] Direct3D_FPS  (6) 2014.05.08
[Secuinside2013] beist_attack_game_150  (0) 2014.05.02
gdb 명령어 요약집  (0) 2014.04.28