드림핵 워게임 풀이 정리
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
배열을 구할 수 있다.
|
|