호그와트

리버싱은 매우 재미있다

영웅*^%&$ 2021. 11. 16. 14:39
728x90

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라는 정확한 결과값이 도출된다

728x90

'호그와트' 카테고리의 다른 글

웹해킹 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