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

Spring Framework AOP(Aspect Oriented Programming)이란?

스프링은 코드의 반복 사용을 줄이고 효율적이며 결합도가 낮은 유연한 코드를 작성하길 원한다. 우리는 코드를 작성할때 크게 중요한 부분은 아니지만 어떤 값을 확인하는 등 여러 부분에서 중복으로 쓰이는 코드가 있을 수 있다. 예를 들면 로그인 세션이 남아 있는지, 또는 어떤 로직에서의 에러에 대한 로그를 핸들링 할때 등등 상황은 매우 다양하다. OOP는 코드의 재활용성을 높이고 객체지향을 통해 코드 개발을 더 쉽게, 유지보수하기 편하게 하기 위해 시작되었다. 여기서 더 나아가 Spring에서는 AOP를 통해 비즈니스 로직 상에 중복적이지만 꼭 필요한 코드를 따로 묶어 외부로 분리해 메인 코드에 집중할 수 있게 해주는 기법이다. ...

4월 6, 2022 · 3 분 · Yunjoker

Spring Framework DI(Dependency Injection)이란?

스프링 프레임워크에서는 DI, IOC, AOP 등이 사용되고 있다. 이번에는 스프링 프레임워크에서 사용하는 DI Dependency Injection, 의존주입에 대해서 포스팅 해보려 한다. 의존 주입이라고 하면 영어를 직역한 표현같이 뭔가 잘 이해가 되질 않는다. 자바에서는 객체를 사용하고 이 객체를 다른 클레스에서 사용하려면 객체를 new 클레스이름 을 통해 생성해서 사용해야 한다. DI는 이 new를 통해 생성하는 부분을 자동으로 해준다 생각하면 편할 것 같다. 기본적인 개념은 객체를 직접 생성하는 것이 아니라 자동으로 생성되는 것이다. ...

4월 4, 2022 · 2 분 · Yunjoker

Spring Framework STS로 스프링 MVC 프레임워크 프로젝트 만들기

스프링 부트 스프링 부트의 경우 프로젝트 생성이 매우 쉬운 편이다. https://start.spring.io/ 에 들어가면 spring initializr에서 프로젝트 설정을 할 수 있고 프로젝트 이름, 패키징 방식, 자바 버전, 여러 의존성 등 여러가지 설정을 추가 한 후에 프로젝트 파일을 다운 받을 수 있다. 스프링 부트에 관해서는 다른 글로 다시 정리해 보겠다. 스프링 프레임워크 스프링 프레임워크는 자체 개발도구 IDE를 제공한다. 이는 자바 IDE로 많이 알려진 Eclipse를 기반으로 하여 Spring Tools이라는 플러그인을 설치해 배포하는 방식이다. ...

3월 28, 2022 · 7 분 · Yunjoker