Reversing/CodeEngn

[CodeEngn] Basic RCE L01

PhoB 2023. 8. 15. 00:31

정말 오랜만에 글을 쓰네요 어쩌다보니 BoB 12기에 붙어버려서 눈코뜰새 없이 바빠서 그렇습니다...하핫...

리버싱도 많이 까먹은 상태라 다시 기초부터, 쉬운문제부터 다시 시작해보려고 합니다.

 

코드엔진이라는 사이트에서 제공해주는 문제입니다. 우연찮게 BoB를 운영하는 한국정보기술연구원이 협찬하는 곳이였네요 하하핫!

파일을 다운받고 열어보겠습니다!

이런 문구가 뜹니다. HDD를 CD-Rom이라고 인식하게 하라고 하네요

 

IDA에서 한번 열어보니

이런식으로 구조가 나오는군요

x64dbg(x32)에서도 그래프로 한번 보았는데 음.. 제가 잘 못다루는건지 IDA만큼 명확하게 보이진 않는것 같습니다!

아무튼 GetDriverTypeA를 호출하고 eax와 esi를 비교하면서 jz(Jump if Zero)를 통해 분기를 하고 있습니다.

기본적으로는 왼쪽으로 가지만 저희의 목표는 오른쪽으로 가게 해야할듯 합니다..

 

그럼이 GetDriveTypeA()라는 함수가 무엇이냐

그렇다고 합니다.

그렇다면 저희는 CD-ROM으로 인식되어야하기 때문에 리턴값이 5가 되면 되겠군요!

IDA를 통해 구조를 확인했으니 x64를 통해서 찾아가 줍시다 문자열 찾기를 통해서 abex라는 문자를 찾아주었습니다.

cmp eax,esi를 진행해서 제로플래그가 설정되어있으면 (je = jz) 점프하고 아니라면 점프하지 않습니다!

근데 보면 점프를 해야하니까 함수의 리턴값이 5가 되어야겠네요!

 

문제가 리턴값을 구하는 것 이였으니 답은 5일듯 합니다.

Auth들어가서 key에 답을 입력해주면

 

 

그렇다면 실제로 코드 패치를 해보면 방법은 몇가지가 있습니다.

1.eax , esi값을 조작해서 제로플래그(ZF)가 설정되게 하기

2. 그냥 무조건 분기(jmp)로 코드패치하기

가 당장은 생각납니다..

 

그냥 편하게 2번으로 하겠습니다.

스페이스바 눌러서 코드패치!
성공!