드림핵 워게임 풀이 정리
Secure Mail

문제 파일을 열어보니 생년월일을 입력받는 웹 페이지다. 특정 생년월일을 입력해야 플래그를 획득할 수 있는 것 같다.

소스 코드를 확인해보았는데 코드가 난독화 되어있어 알아보기 어렵다.
| |
아래 부분에 위 코드를 보면, 버튼을 클릭했을 때 입력받은 값을 인자로 _0x9a220 함수를 호출하는 것을 확인할 수 있다.
따라서 _0x9a220 함수의 인자에 생년월일 형식의 값을 무차별 대입하면 될 것 같다.
개발자 도구의 콘솔을 통해 자바스크립트 코드를 실행하였다.
| |

fake

여러 함수가 있는데 ptr의 값이 저장되는 sub_140B 함수부터 확인해보았다.

v3 배열과 v4의 문자열, v5 값이 저장되어 있는 값을 이어서 ptr 변수의 위치부터 차례대로 저장한다.


나머지 세 함수 중 두 함수는 ptr 포인터의 위치와 연관이 없는 값들이라 볼 필요가 없다.

두 번째 함수를 보면 ptr에 직접적인 연산이 되는 세 함수가 있는데, 하나씩 확인해보겠다.

첫 번째 함수는 a1[i]와 a1[a1[1] - i - 1]의 값을 바꾸는 코드를 반복하는 함수인데, a1[1]에는 문자열의 길이인 0x17이 저장되어 있다.

두 번째 함수는 a1[i]와 a1[i+1]의 값을 바꾸는 함수이다.

세 번째 함수는 a1[i]에 a2와 xor 연산을 한 값을 저장한다.
위 과정을 cpp을 이용하여 코드로 구현하였다.
| |
please, please, please
| |
문자열을 추출하면 플래그가 나온다.
CTFd 문제 풀이 정리
Custom 1

check1 함수의 반환값이 1이 되어야 한다.

if문 안의 *(_BYTE *)(a1 + v2) - ((v1 ^ 0xA6) + 4 * (_BYTE)v2) != v3 이 식을 만족하지 않고, v2를 카운터로 사용할 때까지 80번 반복한다.
해당 식을 정리하면 a1[v2] - (v1 ^ 0xA6) + 4 * v2 != v3이 되는데, 구하기 위한 a1 배열을 남기고 나머지를 이항하면 ((v1 ^ 0xA6) + 4 * v2 + v3[v2])가 알맞은 입력값이 된다.
cpp를 이용하여 출력하였다.
| |
Custom 2

check2 함수의 반환값이 1이 되어야 한다.

__ROL1__(*(_BYTE *)(a1 + v2) ^ (3 * v2), (unsigned int)v2 % 7 + 1) != v3 식이 false가 되어야 만족하고, v2를 카운터로 사용하여 168번 반복하게 된다.
따라서 이를 역으로 연산한 식인 ror(data[i], v2 % 7 + 1) ^ (3 * v2)이 알맞은 입력값이 된다.
cpp를 사용하여 코드를 작성하였다.
| |
Custom 3

check3 함수에서 1이 반환되어야 함을 알 수 있다.

sbox[*(unsigned __int8 *)(a1 + v3)] != v2 이 식을 만족하는 값을 찾아야 하는데, v1을 카운터로 사용하여 v1이 100이 될 때까지 반복한다.
이 식을 정리하면 sbox[a1[v3]] != v2이 되는데, 무차별 대입으로 sbox[j] = enc3[i]가 만족하는 값을 찾으면, j의 값이 a1[perm[i]]이기 때문에, a1[perm[i]] 값에 j를 저장하면 a1 배열을 구할 수 있다.
| |