Basic RCE L04

한라뽕🍊·2024년 4월 16일
0

reversing

목록 보기
2/2

문제

이 프로그램은 디버거 프로그램을 탐지하는 기능을 갖고 있다.
디버거를 탐지하는 함수의 이름은 무엇인가?

실행

디버거로 실행시

분석


메인에서 _main_0를 호출하는 것을 볼 수 있다.

일단 이름으로 보았을 때

문제에서 요구하는 정답은 IsDebuggerPresent 이다!


조금 더 분석해보자면...

분기 이후로 printf가 둘 존재하는 것을 보면 IsDebuggerPresent 실행 후 일련의 과정 으로 디버깅 여부를 판단하고 eax에 0 혹은 다른 값을 저장하는 것으로 보인다.
정적 분석으로는 IsDebuggerPresent 의 동작을 알기 어려우니
브레이크 포인트를 걸고 디버거로 분석해보자.

step into

step into

에, 이게 끝이다.
보아하니 [fs:0x30]+2 의 값을 eax에 저장하는 것을 볼 수 있다.
구체적으로 어떤 값이지?!

IsDebuggerPresent 의 호출이 끝나고 eax에는 1이 저장되어있다.

이대로 계속 진행되면 jz를 스무스하게 지나가게 되므로

요로코롬 출력이 된다.

그렇다면 디버거 실행 중 eax값을 0으로 수정해주면 정상인 척 실행시킬 수 있을 것 같다!

요로코롬,

우회가 된다!

번외

자 그러면 fs:0x30[fs:0x30] + 2 에는 무엇이 있을까?
조사해본 결과를 정리해보겠다!
.
.
여러 세그먼트 레지스터 중, 역할이 고정적인 것들도 있는 반면
운영체제에 따라 역할이 유동적인 것도 있다.
fs가 그렇다.

문제로 제시된 프로그램은 32bit 윈도우이며,
32bit 윈도우에서는 fs가 무엇으로 사용되냐면,,,

32비트 윈도우의 FS 레지스터는 유저 모드 기준으로
TIB(Thread Information Block) 이라고 불리는 구조체를 가리킨다.
(TEB(Thread Environment Block)라고도 불린다!)

이 구조체는 현재 실행 중인 스레드 에 대한 정보를 저장하고 있다.
API 함수를 호출하지 않고도 정보를 얻기 위해 사용된다.

대략적인 구조는 이렇다(참고)
FS:[0x00] : 현재 SEH 프레임
FS:[0x18] : TEB
FS:[0x20] : PID
FS:[0x24] : TID
FS:[0x30] : PEB
FS:[0x34] : Last Error Value

우리가 궁금했던 fs:0x30PEB(Process Environment Block) 의 주소였다!

0x002 BYTE BeingDebugged;
0x008 void* ImageBaseAddress;
0x00C _PEB_LDR_DATA* Ldr;
0x018 void* ProcessHeap
0x064 DWORD NumberOfProcessors;
0x068 DWORD NtGlobalFlag;

[fs:0x30]+2 는 BeingDebugged 값으로,
프로세스가 디버깅 당하는 중일 때는 1,
아닐 때는 0을 저장하는 부분이다.

참고자료

https://sanseolab.tistory.com/47
https://reverseengineering.stackexchange.com/questions/16336/where-es-gs-fs-are-pointing-to
https://ko.wikipedia.org/wiki/Win32_%EC%8A%A4%EB%A0%88%EB%93%9C_%EC%A0%95%EB%B3%B4_%EB%B8%94%EB%A1%9D

profile
낑깡이 될거야

0개의 댓글