프로그램은 다음과 같이 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 |