Description
우리의 친구 아모가 미션을 주었습니다. "내가 원하는 결과가 나오도록 값을 입력해 줘!"
주어진 바이너리를 분석하고 알맞은 값을 입력하면 플래그가 출력됩니다. 플래그는 flag
파일에 있습니다.
플래그 형식은 DH{…} 입니다.
문제 파일을 받아보면 chall 실행파일과 flag 파일이 주어진다.
main 함수
int __cdecl main(int argc, const char **argv, const char **envp) { char s1[9]; // [rsp+6h] [rbp-3Ah] BYREF char s[9]; // [rsp+Fh] [rbp-31h] BYREF unsigned int v6; // [rsp+18h] [rbp-28h] BYREF unsigned int v7; // [rsp+1Ch] [rbp-24h] BYREF char *s2; // [rsp+20h] [rbp-20h] int fd; // [rsp+2Ch] [rbp-14h] void *buf; // [rsp+30h] [rbp-10h] unsigned int v11; // [rsp+38h] [rbp-8h] int i; // [rsp+3Ch] [rbp-4h] v7 = 0; v6 = 0; v11 = 0; initialize(argc, argv, envp); buf = malloc(0x45uLL); fd = open("./flag", 0); read(fd, buf, 0x45uLL); close(fd); get_rand_num(&v6); printf("Random number: %#x\n", v6); printf("Input? "); __isoc99_scanf("%d", &v7); v11 = v6 ^ v7; snprintf(s, 9uLL, "%08x", v6 ^ v7); for ( i = 0; i <= 7; ++i ) s1[i] = s[7 - i]; printf("Result: %s\n", s1); s2 = "a0b4c1d7"; if ( !strcmp(s1, "a0b4c1d7") ) { puts("Congrats!"); puts((const char *)buf); } else { puts("Try again"); } return 0; }
먼저 random number를 생성해서 16진수로 다음과 같이 수를 출력한다.
Random number: 0xXXXXXXXX
그리고 사용자로부터 10진수 형식으로 수를 입력받는다.
10진수 형식으로 입력받은 수는 random number와 XOR 연산하고,
연산한 값을 16진수로 변환하여 문자열 형식으로 s 배열에 저장한다.
마지막으로 s1배열에 s 배열에 있는 문자를 역순으로 하나씩 저장하는걸 8번 반복해서
s1배열에 a0b4c1d7 문자열이 담겨있는지 비교한다.
ubuntu@wh1te4ever-main:~/Desktop/simple-operation$ ./chall Random number: 0xdd717d7e Input? 12345678 Result: 03c1dcdd Try again
ubuntu@wh1te4ever-main:~/Desktop/simple-operation$ python3 Python 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> hex(0xdd717d7e ^ 12345678) '0xddcd1c30' #역순으로 Result 출력됨
풀이
a0b4c1d7 문자열을 역순으로 배열시키고
그 수를 random number와 XOR 시킨 수를 10진수로 입력하면 해결된다.
0x7d1c4b0a ^ (random number)
from pwn import * import re corrected_str = "a0b4c1d7" converted_str = int("0x" + corrected_str[::-1], 16) #0x7d1c4b0a context.log_level = 'debug' p = remote("host3.dreamhack.games", 20312) data = p.recvuntil('Input? ') #data = b'Random number: 0xXXXXXXXX\nInput? ' random_num = re.search(': (.+?)\n', data.decode('utf-8')).group(1) print("Random Number:", random_num) input_num = int(random_num, 16) ^ converted_str p.sendline(str(input_num)) p.recvall()
myMac@MacBook-Pro Desktop % python3 str.py [+] Opening connection to host3.dreamhack.games on port 20312: Done [DEBUG] Received 0x1a bytes: b'Random number: 0xff5f6dbe\n' [DEBUG] Received 0x7 bytes: b'Input? ' Random Number: 0xff5f6dbe [DEBUG] Sent 0xb bytes: b'2185438900\n' [+] Receiving all data: Done (96B) [DEBUG] Received 0x11 bytes: b'Result: a0b4c1d7\n' [DEBUG] Received 0x4f bytes: b'Congrats!\n' b'DH{cc0017076ad93f32c8aaa21bea38af5588d95d2cdc9cf48760381cc84df4668e}\n' [*] Closed connection to host3.dreamhack.games port 20312