3890145726
이 숫자가 뜻하는 바는 무엇인가?
-> 숫자가 랜덤처럼 보여서 몰랐는데
3890145726은 자세히 보면 1~9까지의 숫자가 전부 있다
1234567890
각각의 입력값을 받아서 숫자로 변환시켜 주는 것을 의미한다
이는 역으로 말해서 원하는 input값을 넣기 위해서
변환된 알파벳 값을 input해야한다는 것을 의미한다
전체적인 큰 그림을 그려보았을 때
핵심은 매우 간단하다
한 가지 입력값을 받은 후에
sub_1400011E0 함수를 통해서
값을 검증한 다음
correct / wrong 을 출력하는 것이다
dwsqawdu는 입력값 뒤에 더하는 값이라는 건
알 수 있었다
input d w s q a w d u
x * 2 - 1 + 2 * 7
즉 이 프로그램은 알파벳과 숫자를 서로 변환시켜서
정확한 값에 맞는 input값을 요구하는 문제였던 것이다
I was blind but now I see
#include <stdio.h>
int numberConvert(char in) {
int ret = 0;
switch(in){
case 'q': ret = 1; break;
case 'w': ret = 2; break;
case 'e': ret = 3; break;
case 'r': ret = 4; break;
case 't': ret = 5; break;
case 'y': ret = 6; break;
case 'u': ret = 7; break;
case 'i': ret = 8; break;
case 'o': ret = 9; break;
case 'p': ret = 0; break;
default:{
printf("wrong input!\n");
exit(0);
}
}
return ret;
}
int check(unsigned char *input) {
int index = 0;
int now = numberConvert(input[index]);
index++;
while(input[index]) {
int operation = input[index];
int number = numberConvert(input[index+1]);
switch(operation) {
case 'a': now += number; break;
case 's': now -= number; break;
case 'd': now *= number; break;
case 'f': now /= number; break;
case '\0':break;
}
index += 2;
}
return now == 91;
}
int main(){
unsigned char *input = malloc(0x10);
memset(input, 0, 0x10);
printf("input: ");
input[0] = getchar();
input[1] = 'd';
input[2] = 'w';
input[3] = 's';
input[4] = 'q';
input[5] = 'a';
input[6] = 'w';
input[7] = 'd';
input[8] = 'u';
if (check(input)) {
puts("correct!");
}
else {
puts("wrong!");
}
}
결국 핵심 함수를 모두 리버싱 하면 위와 같은 형태가 된다
위에 정확한 input (값일치) 는 6이고 6으로 변환되는 값은 y이므로
y를 넣으면 correct라는 정확한 결과값이 도출된다
'호그와트' 카테고리의 다른 글
웹해킹 56번 문제 (0) | 2021.11.16 |
---|---|
드림핵 재밌는 misc문제 (0) | 2021.11.16 |
드림핵 basic explorer 01 (0) | 2021.11.16 |
드림핵 ssti 핵심 (0) | 2021.10.25 |
드림핵 포너블 도서관 pwn (0) | 2021.10.25 |