Description
Category: Reversing
Source: TAMUctf 2019
Points: 493
Author: Jisoon Park(js00n.park)
Description:
nc rev.tamuctf.com 8189
Difficulty: hard
Write-up
prodkey를 입력하라고 한다. prodkey를 어떻게 확인하는지 살펴보자.
puts("\nPlease Enter a product key to continue: ");
fgets(&s, 30, _bss_start);
if ( (unsigned __int8)verify_key(&s) )
{
stream = fopen("flag.txt", "r");
fgets()로 받은 입력값을 verify_key() 함수를 통해 검사하고 있다.
verify_key() 함수는 check_01()부터 check_0F() 함수까지 15가지의 조건 함수를 만족하는지 확인한다.
각 조건 함수들은 입력한 값의 각 자리에 대해 부등식 또는 다항식의 형태를 정의하고 있는데, 이를 모두 만족하는 값들을 찾아야 한다.
연립방정식을 세워서 풀어보는 것도 재미있겠지만, 이런 문제는 보통 symbolic execution으로 풀으라고 나오는 문제이다.
symbolic execution의 대명사인 angr를 이용해서 풀어보자.
간단하게 바이너리 파일을 연 다음 탐색을 성공했을 때 도착할 주소를 대충 넣으면 알아서 적당한 데이터를 찾아준다.
그 후 서버로 접속해서 찾은 데이터를 전송하도록 exploit을 구성하면 flag를 얻을 수 있다.
Flag : gigem{5y573m_0v3rfl0w}
'writeups > Reversing' 카테고리의 다른 글
Crypto Crackme Basic (0) | 2019.11.25 |
---|---|
NoCCBytes (0) | 2019.11.23 |
Cheesy (0) | 2019.11.23 |
keypad CrackMe (0) | 2019.11.23 |
flag (0) | 2019.11.23 |