'll Hacker
dreamhack : rev-basic-4 write-up 본문
Contents
728x90
step1. main 함수 분석
알맞은 입력을 한다면 Correct 출력되고, 올바르지 않다면 Wrong이다.
step2. main 내부 함수 분석
__int64 __fastcall sub_140001000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 0x1C; ++i )
{
if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i] )
return 0i64;
}
return 1i64;
}
if문 중심으로 보쟈
지피티 출처>>>
- a1 주소로부터 i 바이트 떨어진 위치의 값을 _BYTE로 읽어옵니다.
- 읽어온 값을 16배(<< 4)하고, 그 값을 unsigned __int8로 변환합니다.
- 읽어온 값을 4비트 오른쪽으로 시프트(>> 4)합니다.
- 두 연산의 결과를 OR 연산(|)으로 결합합니다.
- 결합된 결과를 byte_140003000[i]와 비교합니다.
- 값이 일치하지 않으면 0을 반환합니다.
오 그러면 byte_140003000은 뭐지?
이런 식으로 되어있음
step3. 역연산
그러면 export해서
파이썬 코드로 구현해보자(파이썬 코드는 드림핵 출처임)
https://successing.tistory.com/58
위 링크로 들어가면 있음.
.
.
.
.
.
.
.
.
읭?????
여태까지 한거와 다름..ㅠ
아하
드림핵에 나온 코드는 정해진 코드가 아니었고
코드에 나와있는 연산마다 역연산 계산하는 코드가 다르겠구나라고 알게 되었음
따라서
if문을 역연산해줘야된다는 의미
따라서 역연산 과정은
1-1. exprot한 data를 가지고 16을 곱한다
1-2. data값을 4만큼 오른쪽으로 시프트한다
2. 이렇게 얻은 1-1, 1-2값을 비트 OR연산을 한다
3. 비트연산한 값을 0xFF(255)와 AND(&) 연산해서 8비트로 잘라내고
4. result 리스트에 있는 숫자들을 바이트 객체로 변환하여 반환해주면 끝남.
이것을 파이썬 코드로 구현하면
data = bytes.fromhex("24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27 13 26 26 C6 56 F5 C3 C3 F5 E3 E3 00 00 00 00 00")
data = data[:27]
result = []
for i in range(27):
result.append(((16 * data[i]) | (data[i] >> 4)) & 0xFF)
result = bytes(result)
print(result)
이거와 같고
Anaconda Prompt에 실행시켜준다.
그래서 플래그값이 나온것을 확인할 수 있다.
훗훗
리버싱 재밌군!!! ✌️✌️✌️
구독과 좋아요 뷰탁드립니다~!~!~!
728x90
'Hacking > Reverse Engineering' 카테고리의 다른 글
dreamhack : rev-basic-8 write-up (0) | 2024.06.01 |
---|---|
dreamhack : rev-basic-6 writeup (1) | 2024.05.30 |
dreamhack : rev-basic-2 write-up (0) | 2024.05.15 |
dreamhack : simple-operation write-up (0) | 2024.05.13 |
dreamhack : rev-basic-3 write-up (0) | 2024.05.13 |