대회기간 : 토요일, 19 11월 2016, 02:00 UTC — 월요일, 21 11월 2016, 07:00 UTC
대회명 : RC3
문제 : logmein - Reversing [100pt]
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 |