HTB DebugMe

2020. 7. 10. 04:320x02 Reverse Engineer

728x90

문제 설명

 

A develper is experiementing with different ways to protect their software. 

They have sent in a windows binary that is suposed to super secureand really hard to debug. 

Debug and see if you can find the flag.

 

컨셉.  메인 암호화 

 

처음 부분은 여기이다. 

rdtsc는 안티디버깅에서 자주 쓰이는 기법 중에 하나이다.

 

이 부분에서 조건 분기가 몇개 보이는데 과감하게 다 없는 셈 치고 분석에 임하면 된다.

 

여기가 핵심이다. 디버깅 없이 프로그램을 실행했더라면 시간에 구애받지 않기 때문에 멀쩡하게 이 루틴에 접근할 수 있었을 것이다.

 

_main의 시작부터 eax에 대입하는 것을 볼 수 있다.

0x55는 U이다. 하지만, 이런 문제는 이렇게 푸는 것이 아니라 OPCODE 관점으로 접근해야한다.

 

55는 PUSH EBP이다.

즉, 함수 프롤로그 시작을 알리고 있음을 알 수 있다.

 

main 암호화 부분을 살펴보자. 인덱스를 파악해야 복호화에 용이하기 때문이다.

 

마지막으로 추측 되는 곳은 0x1이었고 복호화 하면 pop ebp가 나오게 된다.

 

 

그렇다면 아래의 값이 ret가 될 확률이 높다. 이 값을 복호화 해보자.

 

정확하다.

 

범위는 다 구했다.

현 바이너리에서 \x09 ~ \x9F까지를 구하면 된다. 

 

조금 편하게 구하기 위해 어셈블리어를 OPCODE로 변환해본다.

09 D5 B9.. 

 

offset : 0xA20 ~ 0xB91

 

import sys

 

f = bytearray(open("./main_enc","rb").read())

size = len(f)

byte_array = bytearray(size)

 

for i in range(size):

    byte_array[i] = f[i] ^ 0x5C

 

open("./main_dec","wb").write(byte_array)

 

 

복호화 바이너리

 

복호화 XOR 0x4B 

 

이 값을 그대로 디버깅 하면 답이 나온다.

^_^ Easy 

 

f = bytearray(open("./new_data","rb").read())
size = len(f)
write_byte = bytearray(size)

for i in range(size):
    write_byte[i] = f[i] ^  0x5C

open("./abstracted","wb").write(write_byte)

# abstracted binary

data = "\x6A\x25\x3E\x2D\x14\x19\x14\x31\x20\x28\x22\x39\x3F\x14\x19\x2E\x0C\x0C\x3E\x29\x78\x0F\x14\x7A\x3f\x25\x0A\x14\x2C\x25\x22\x27\x27\x7B\x39\x1F"

r = []
for i in range (0, len(data)):
    r.append(chr(ord(data[i])^0x4B))

print(''.join(r)[::-1])

 

'0x02 Reverse Engineer' 카테고리의 다른 글

HTB Impossible Password  (0) 2021.02.19
HTB Mobile - Cat  (0) 2020.07.10
ANTIDEBUG Problems  (0) 2019.02.18
HACKINGCAMP 19 Can You Login ?  (0) 2019.02.18
어셈 64비트 구구단  (0) 2018.07.13