[Dreamhack] rev-basic-4
문제
분석
프로그램 실행
프로그램을 받아서 실행했더니, 역시나 바로 종료된다.
ida pro
ida pro를 이용해서 파일을 보자.
나는 프로그램을 실행했을 때, 나타나는 문자열을 검색해서 해당 부분의 코드들을 볼 것이다.
처음에는 start 함수가 나온다.
[shift + f12]를 사용해서 문자열 검색을 해보자.
"Correct"이 보인다. 더블클릭해서 들어가서, 해당 문자열을 참조하는 코드를 보기 위해 [x]키를 눌러 들어간다.
코드분석: sub_140001130()
__int64 sub_140001130()
{
char v1; // [rsp+20h] [rbp-118h]
memset(&v1, 0, 0x100ui64);
sub_1400011C0("Input : ");
sub_140001220("%256s", &v1);
if ( (unsigned int)sub_140001000((__int64)&v1) )
puts("Correct");
else
puts("Wrong");
return 0i64;
}
sub_140001130 함수의 작동방식은 다음과 같다.
- v1 문자형 변수를 선언한다.
- memset 함수를 통해 변수를 초기화한다. (v1변수를 0으로 0x100만큼 초기화)
- printf함수로 "Input : " 출력
- scanf_s 함수로 256바이트 크기의 문자열을 받음
- if 분기문으로 sub_140001000함수의 실행 결과가 참(1)이면 Correct 거짓(0)이면 Wrong 출력을 하고 종료한다.
그렇다면 우리는 sub_140001000함수가 무엇인지 알아볼 필요가 있다.
더블클릭해서 함수를 자세히 보자
코드분석: 함수 sub_140001000()
signed __int64 __fastcall sub_140001000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 0x1C; ++i )
{
if ( (16 * *(_BYTE *)(a1 + i) & 0xF0 | ((signed int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i] )
return 0i64;
}
return 1i64;
}
int i를 선언한다.
i=0인 상태에서 i가 0x1B까지 i를 증가시킬 때까지, for 반복문 안의 if분기문을 돌린다.
분기문으로 (16*a1[i] &0xF0 | (a1[i]>>4)가 byte_140003000[i]와 같지 않으면 종료한다.
byte_140003000[i]는 무엇인지 한번 보자
역시나 byte_140003000에 16진수로 아스키 문자들이 들어가 있는 것을 알 수 있다.
분기문의 결과와 byte_140003000의 값이 같아야지 Correct가 나오므로 저 값들을 풀어보자.
풀이
#!/usr/bin/env python3
a1 = [0x24,0x27,0x13, 0xC6, 0xC6, 0x13, 0x16,0xe6, 0x47, 0xf5, 0x26, 0x96, 0x47, 0xf5, 0x46, 0x27, 0x13, 0x26, 0x26, 0xc6, 0x56, 0xf5, 0xc3, 0xc3, 0xf5, 0xe3, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00]
sub_flag = ""
for i in range(0, 28):
sub_flag += chr(16*a1[i] & 0xf0 | a1[i] >> 4)
print(sub_flag)
답
끝.
'Write-up > Wargame' 카테고리의 다른 글
[Dreamhack] ReturnAddressOverwrite (1) | 2024.03.22 |
---|---|
[pwnable.kr] fd (0) | 2023.11.12 |
[Dreamhack wargame] rev-basic-3 (0) | 2023.09.04 |
[Dreamhack wargame] Quiz: x86 Assembly 2 풀이 (0) | 2022.09.25 |
[Dreamhack wargame] Quiz: x86 Assembly 1 풀이 (2) | 2022.09.25 |