2020. 7. 10. 04:32ㆍ0x02 Reverse Engineer
문제 설명
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 |