티스토리 뷰
최종 수정: 2015-10-27
hackability@TenDollar
안녕하세요. Hackability 입니다.
이번에 포스팅 할 내용은 2015 Layer7 CTF에서 나왔던 ReverseMe 라는 문제 입니다. 제가 딱히 SNS 를 하지 않기 때문에 이 글을 빌어 매년 Layer7 CTF 를 준비해주시는 선린고 분들께 감사의 말을 남깁니다. :-)
문제에 첨부된 ReverseMe.zip 을 다운받아 압축을 해제 하면 ReverseMe.mp3 파일이 떨어 집니다.
실행 시키면 그냥 mp3 파일 이지만 hexdump로 mp3 의 마지막 부분을 보면 PE 바이너리가 거꾸로 저장되어 있음을 알 수 있습니다. (그래서 문제 이름이 로꾸꺼 인듯)
그래서 해당 바이너리만 뽑아서 python 코드로 바이너리를 역순으로 다시 만들어서 exe를 만들었습니다.
fd = open("dump.bin", "rb")
data = fd.read()[::-1]
fd.close()
fd = open("prob.exe", "wb")
fd.write(data)
fd.close()
Dump 된 PE 를 살펴 보면 다음과 같습니다.
// Main Function
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax@2
printf("input : ");
scanf("%s", &hostlong);
if ( sub_401060() )
{
printf("Correct !\n");
printf("flag is %s\n", &hostlong);
result = 0;
}
else
{
printf("InCorrect ..");
result = 0;
}
return result;
}
// 문제의 주요 Function
int sub_401060()
{
int result; // eax@2
u_long v1; // edi@3
u_long v2; // ebx@3
signed int v3; // esi@3
u_long v4; // edi@3
int v5; // eax@5
u_long v6; // eax@10
if ( strlen((const char *)&hostlong) == 8 )
{
v1 = dword_40336C;
v2 = htonl(hostlong);
v3 = 0;
v4 = htonl(v1);
do
{
switch ( v3 )
{
case 0:
v5 = sub_401110(v4);
goto LABEL_9;
case 1:
v5 = sub_401160(v4);
goto LABEL_9;
case 2:
v5 = sub_4011B0(v4);
goto LABEL_9;
case 4:
v5 = sub_401200(v4);
LABEL_9:
v2 ^= v5;
break;
default:
break;
}
v6 = v2;
++v3;
v2 = v4;
v4 = v6;
}
while ( v3 < 4 );
result = v6 == 0x72659830 && v2 == 0x64C38B40;
}
else
{
result = 0;
}
return result;
}
Reversing 문제에 이런 형태의 문제들이 자주 나옵니다.
전체 적인 로직은 다음과 같습니다.
1. Main에서 hostlong에 8바이트 입력을 받습니다.
2. 입력 받은 8바이트를 4바이트씩 나누어 연산을 했을 때 v6와 v2에 빨갛게 해놓은 값이 맞는지 체크 합니다.
3. 만약 맞다면 사용자가 입력한 8 바이트가 실제 문제의 flag가 됩니다.
로직을 보면 알겠지만 문제에 Correct라고 뜨게 만드는 8 바이트가 실제 문제의 auth 값으로 쓰이는 문자열이 되게 됩니다.
문제의 중요한 것은 8바이트 입력을 해서 v6와 v2가 특정 값이 되게 해야 합니다.
aaaabbbb, abcdefgh 등등 8 바이트를 여러번 입력 해본 결과 입력한 8바이트에 대해 do~while의 결과가 다음과 같은 로직이 있음을 알 수 있습니다.
(사실 이거 분석하는데 제일 시간이 오래 걸림 -_-;;;)
앞 4바이트 => (2바이트) + (2바이트) ^ 0xFF55
뒤 4바이트 => (1바이트) + (2바이트) ^ 0xAAFF + (1바이트)
그러므로, 정답은 다음과 같습니다.
0x72659830 = 0x72 + 0x65 + (0x9830) ^ 0xFF55 = 0x72657675 => rege
0x64C38B40 = 0x64 + (0xC38B ^ 0xAAFF) + 0x40 = 0x65697440 => dit@
따라서 정답은 regedit@
'CTF_WriteUps > 2015_CTF' 카테고리의 다른 글
[2015_TrendMicro_CTF] (Programming 100) click on the different color (0) | 2015.10.27 |
---|---|
[2015_CSAW_CTF] (Reversing 300) FTP (0) | 2015.10.27 |
[2015_Hackover_CTF] (Pwnable 75) easy_shell (0) | 2015.10.26 |
[2015_TrendMicro_CTF] (Programming 500) BlackJack (0) | 2015.10.26 |
[2015_HITCON_CTF] (Pwnable 200) nanana (0) | 2015.10.26 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- shellcode writing
- IE 11 exploit
- IE 10 리버싱
- WinDbg
- 2015 School CTF
- Mona 2
- IE 10 God Mode
- IE 11 UAF
- TenDollar
- School CTF Write up
- TenDollar CTF
- UAF
- 쉘 코드 작성
- IE 11 exploit development
- 쉘 코드
- data mining
- Windows Exploit Development
- School CTF Writeup
- heap spraying
- 윈도우즈 익스플로잇 개발
- expdev 번역
- shellcode
- 데이터 마이닝
- IE UAF
- IE 10 익스플로잇
- Use after free
- 힙 스프레잉
- 2014 SU CTF Write UP
- CTF Write up
- IE 10 Exploit Development
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함