[Dreamhack] REV Small Counter

드림핵 리버싱 Small Counter 문제풀이

5월 31, 2023 · 4 분 · Yunjoker

Dreamhack rev-basic-7 문제풀이

이번 문제는 드림핵 rev-basic-7 리버싱 문제를 풀어보자. 우선 basic-6과 동일하게 문자열을 입력 받고 정답이면 Correct, 아니면 Wrong을 출력한다. 바이너리 실행결과는 다음과 같다. 우선 가장 먼저 해야할 일은 main함수를 찾는것이다. 윈도우 바이너리인 PE파일의 헤더 구조를 보면 매우 많은 정보들이 들어있다. 그것들 중 리버싱을 할떄 중점으로 봐야할 부분은 .text영역이다. 실질적으로 코드가 컴파일되어 저장되는 영역으로 대부분의 main함수는 이 영역 시작 지점과 인접하게 존재한다. 컴파일러의 보안 미티게이션의 추가로 메모리 주소 랜덤화가 자동으로 걸려 0x401000주소에 main이 들어가는 경우는 이젠 없을 것이다. ...

5월 1, 2022 · 6 분 · Yunjoker

Dreamhack rev-basic-6 문제풀이

이번에는 드림핵 리버싱 베이직 6번 문제를 풀어보자. 이전에 올렸던 rev-basic-5 문제와 동일하게 바이너리를 실행 시키면 input : 이라는 문자열과 함께 문자열을 입력 받고 정답이면 Correct, 아니면 Wrong을 출력한다. 우선 동일하게 x64 디버거를 이용해 어셈블리를 분석해보자. 해당 프로그램 main의 어셈블리는 다음과 같다. 00007FF782681120 | 40:57 | push rdi | rdi:&"ALLUSERSPROFILE=C:\\ProgramData" 00007FF782681122 | 48:81EC 30010000 | sub rsp,130 | 00007FF782681129 | 48:8B05 F81F0000 | mov rax,qword ptr ds:[7FF782683128] | 00007FF782681130 | 48:33C4 | xor rax,rsp | 00007FF782681133 | 48:898424 20010000 | mov qword ptr ss:[rsp+120],rax | 00007FF78268113B | 48:8D4424 20 | lea rax,qword ptr ss:[rsp+20] | 00007FF782681140 | 48:8BF8 | mov rdi,rax | rdi:&"ALLUSERSPROFILE=C:\\ProgramData" 00007FF782681143 | 33C0 | xor eax,eax | 00007FF782681145 | B9 00010000 | mov ecx,100 | 00007FF78268114A | F3:AA | rep stosb | 00007FF78268114C | 48:8D0D BD100000 | lea rcx,qword ptr ds:[7FF782682210] | 00007FF782682210:"Input : " 00007FF782681153 | E8 58000000 | call chall6.7FF7826811B0 | 00007FF782681158 | 48:8D5424 20 | lea rdx,qword ptr ss:[rsp+20] | 00007FF78268115D | 48:8D0D B8100000 | lea rcx,qword ptr ds:[7FF78268221C] | 00007FF78268221C:"%256s" 00007FF782681164 | E8 A7000000 | call chall6.7FF782681210 | 00007FF782681169 | 48:8D4C24 20 | lea rcx,qword ptr ss:[rsp+20] | 00007FF78268116E | E8 8DFEFFFF | call chall6.7FF782681000 | 00007FF782681173 | 85C0 | test eax,eax | 00007FF782681175 | 74 0F | je chall6.7FF782681186 | 00007FF782681177 | 48:8D0D AA100000 | lea rcx,qword ptr ds:[7FF782682228] | 00007FF782682228:"Correct" 00007FF78268117E | FF15 04100000 | call qword ptr ds:[<&puts>] | 00007FF782681184 | EB 0D | jmp chall6.7FF782681193 | 00007FF782681186 | 48:8D0D A3100000 | lea rcx,qword ptr ds:[7FF782682230] | 00007FF782682230:"Wrong" 00007FF78268118D | FF15 F50F0000 | call qword ptr ds:[<&puts>] | 00007FF782681193 | 33C0 | xor eax,eax | 00007FF782681195 | 48:8B8C24 20010000 | mov rcx,qword ptr ss:[rsp+120] | 00007FF78268119D | 48:33CC | xor rcx,rsp | 00007FF7826811A0 | E8 5B010000 | call chall6.7FF782681300 | 00007FF7826811A5 | 48:81C4 30010000 | add rsp,130 | 00007FF7826811AC | 5F | pop rdi | rdi:&"ALLUSERSPROFILE=C:\\ProgramData" 00007FF7826811AD | C3 | ret | 여기서 정답의 로직을 분석하는 부분은 00007FF78268116E이다. ...

4월 13, 2022 · 5 분 · Yunjoker

Dreamhack rev-basic-5 문제풀이

이번 문제는 드림핵 리버싱문제 rev-basic-5이다. 확실히 베이직 문제이다 보니 약간의 분석과정만 거치면 풀이법이 보여 쉬운편에 속했다. 우선 exe 파일을 다운 받으면 chall5.exe라는 바이너리가 다운로드 된다. 이후 이 바이너리를 실행 시키면 input : 구문으로 문자열을 입력 받고 맞으면 Correct 틀리면 Wrong이라는 문자열을 출력한다. 이제 이 바이너리를 x64 디버거로 분석 해보자. 00007FF6A16C1130 | 40:57 | push rdi | rdi:L"샰櫚Ʊ" 00007FF6A16C1132 | 48:81EC 30010000 | sub rsp,130 | 00007FF6A16C1139 | 48:8B05 E81E0000 | mov rax,qword ptr ds:[7FF6A16C3028] | 00007FF6A16C1140 | 48:33C4 | xor rax,rsp | 00007FF6A16C1143 | 48:898424 20010000 | mov qword ptr ss:[rsp+120],rax | 00007FF6A16C114B | 48:8D4424 20 | lea rax,qword ptr ss:[rsp+20] | 00007FF6A16C1150 | 48:8BF8 | mov rdi,rax | rdi:L"샰櫚Ʊ" 00007FF6A16C1153 | 33C0 | xor eax,eax | 00007FF6A16C1155 | B9 00010000 | mov ecx,100 | 00007FF6A16C115A | F3:AA | rep stosb | 00007FF6A16C115C | 48:8D0D AD100000 | lea rcx,qword ptr ds:[7FF6A16C2210] | 00007FF6A16C2210:"Input : " 00007FF6A16C1163 | E8 58000000 | call chall5.7FF6A16C11C0 | 00007FF6A16C1168 | 48:8D5424 20 | lea rdx,qword ptr ss:[rsp+20] | 00007FF6A16C116D | 48:8D0D A8100000 | lea rcx,qword ptr ds:[7FF6A16C221C] | 00007FF6A16C221C:"%256s" 00007FF6A16C1174 | E8 A7000000 | call chall5.7FF6A16C1220 | 00007FF6A16C1179 | 48:8D4C24 20 | lea rcx,qword ptr ss:[rsp+20] | 00007FF6A16C117E | E8 7DFEFFFF | call chall5.7FF6A16C1000 | 00007FF6A16C1183 | 85C0 | test eax,eax | 00007FF6A16C1185 | 74 0F | je chall5.7FF6A16C1196 | 00007FF6A16C1187 | 48:8D0D 9A100000 | lea rcx,qword ptr ds:[7FF6A16C2228] | 00007FF6A16C2228:"Correct" 00007FF6A16C118E | FF15 F40F0000 | call qword ptr ds:[<&puts>] | 00007FF6A16C1194 | EB 0D | jmp chall5.7FF6A16C11A3 | 00007FF6A16C1196 | 48:8D0D 93100000 | lea rcx,qword ptr ds:[7FF6A16C2230] | 00007FF6A16C2230:"Wrong" 00007FF6A16C119D | FF15 E50F0000 | call qword ptr ds:[<&puts>] | 00007FF6A16C11A3 | 33C0 | xor eax,eax | 00007FF6A16C11A5 | 48:8B8C24 20010000 | mov rcx,qword ptr ss:[rsp+120] | 00007FF6A16C11AD | 48:33CC | xor rcx,rsp | 00007FF6A16C11B0 | E8 5B010000 | call chall5.7FF6A16C1310 | 00007FF6A16C11B5 | 48:81C4 30010000 | add rsp,130 | 00007FF6A16C11BC | 5F | pop rdi | rdi:L"샰櫚Ʊ" 00007FF6A16C11BD | C3 | ret | 다음과 같은 형태의 바이너리이다. 여기서 문자열을 입력 받고 정답임을 검사하는 함수의 위치는 00007FF6A16C117E 이다. 임의 값을 넣고 함수에 bp를 걸어 동작을 확인해보자. ...

4월 9, 2022 · 4 분 · Yunjoker

Dreamhack rev-basic-4 문제풀이

이번 문제는 드림핵 리버싱문제 rev-basic-4이다. 우선 문제파일을 다운받으면 chall4.exe라는 프로그램이 나온다. 이 프로그램을 실행 시키면 iput : 이라는 문구와 함께 입력창이 활성화 된다. 이후 임의 문자열을 입력하면 Wrong이라는 문자열을 표시하고 종료된다. 이제 이 프로그램을 x64디버거로 열어보자. 이 프로그램의 main부분이다 input 이후에 call chall4.7FF68AC31000 부분에서 문자열을 비교해 je 명령어로 Correct와 Wrong을 나눠준다. 이부분에 bp를 걸고 쭉 진행해 임의의 문자열을 입력하고 내용을 보자. 위와같은 함수의 어셈블리가 보여진다. 간단히 돌려보며 해석을 해보자. 일단 임의값을 “AAAAA"로 입력했다. ...

3월 11, 2022 · 2 분 · Yunjoker