본문 바로가기
# write-up/- ctf

[RC3 2016] - Reversing 100pt

by ddddh 2016. 11. 21.

대회기간 : 토요일, 19 11월 2016, 02:00 UTC — 월요일, 21 11월 2016, 07:00 UTC 

대회명 : RC3

문제 : logmein - Reversing [100pt]

logmein






1. 흐름 파악




바이너리를 다운 받고 HxD로 열어보면 ELF파일임을 알 수 있다. 

64 bit ELF파일이었고 IDA를 통해서 정적 분석을 먼저 시도하였다. (RC3의 모든 Reversing는 64 bit / ELF 바이너리였다.)





String 값들을 확인해 보면 "Enter your guess"에서 Data를 넘겨주면 어떠한 연산을 거쳐 성공 분기점이 나눠지는 걸 알 수 있다.








2. 정적 분석




scanf로 입력 값을 받은 뒤 strlen으로 입력 길이를 체크 후 분기점으로 나뉘게 된다.

또 한, 중간중간 연산 결과값이 틀리면 INCORRECT 분기점으로 넘어가게 된다.






모든 연산을 정상적으로 마치면 CORRECT 문자열을 뛰어주는 콜 문을 실행해주게 된다.




3. 동적 분석





입력 값은 "f1ay_ddddh", 길이는 0xA 다.

즉, 입력 값 길이는 0x11이 되어야 한다. 일단 강제 패치 후 연산 부분으로 넘어간다.






[rbp - 0x32] - 0x3A, 0x22, 0x41, 0x4C, 0x5F, 0x52, 0x54, 0x5E, 0x4C, 0x2A, 0x2E, 0x3F, 0x2B, 0x36, 0x2F, 0x34, 0x36

[rbp - 0x40] - 0x68, 0x61, 0x72, 0x61, 0x6D, 0x62, 0x65


두 주소에서 값을 하나씩 가져와서 xor 연산을 해준 뒤, 밑의 cmp에서 입력했던 값이랑 비교하는 걸 확인할 수 있다.






4. 플래그 도출








'# write-up > - ctf' 카테고리의 다른 글

[Plaid CTF 2017] no_mo_flo  (0) 2017.04.27
[ALEX CTF] RE5: packed movement  (0) 2017.02.07
[RC3 2016] 메모리 포렌식 - 500pt  (0) 2016.11.27
[RC3 2016] - Reversing 200pt  (0) 2016.11.21
[RC3 2016] - Reversing 350pt  (0) 2016.11.21