Index

문제
실행 파일(exe)이 주어지고, 실행하면 사용자 입력을 받고 프로그램이 종료된다.
문제풀이

main 함수이다. 이 전 문제들과 동일한 형태이다. 바로 sub_140001000
함수로 들어가보자.

i
가 0부터 23까지 24번 반복되고, for문 안의 if 조건문을 역연산하면 되는 문제이다.
if ( *(unsigned __int8 *)(a1 + i + 1) + *(unsigned __int8 *)(a1 + i) != byte_140003000[i] )
뭔가 복잡하게 길어보이지만, 보기 쉽게 바꾸면 다음과 같다.
if (a1[i+1] + a1[i] != byte[i] )
여기서 a1
배열은 사용자가 입력한 문자열이다. 우리는 if 조건문의 결과를 true
가 나오면 Wrong
이 출력되기 때문에 if 구문이 false
이도록 만들어줘야한다.
그 전에, 실행 파일에 저장된 문자열을 확인해보자.

위 사진은 if 조건문에서 비교하는 byte_140003000
배열이다. F2
로 브레이크 포인터를 걸고 F9
로 실행시켜서 프로그램에 적재된 메모리를 찾아가서 확인했다.
사용자 입력 값이 들어오면 위의 수식을 거치고, 최종적인 값이 저 값이 되어야 한다. 수식을 펜으로 그려보면 다음과 같다. (x, y, z, a, b, c
는 임의의 사용자 입력값)

이 값을 반대로 생각해서 원래의 입력 값인 x, y, z, a, b, c
등을 알아내야 한다. 문제에서는 for문으로 i
가 0부터 23까지 총 24번을 반복한다. 이 문제에서의 핵심 키는 마지막 23번 인덱스의 값이 0x00
이라는 것이다. 즉, byte[22] = input[22] + input[23]
에서 input[23] = 0x00
이므로, input[22]
는 위에서 확인함과 같은 0x4c
가 된다.
이처럼 뒤에서 부터 앞으로 값을 구할 수 있다. 펜으로 그려보면 다음 사진과 같다.

이 로직이 이해가 됐다면, 나머지는 파이썬 코드를 통해 플래그 문자열을 얻을 수 있다.
파이썬 풀이 코드
str = [0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3, 0xA1, 0x98, 0x4C, 0x00]
byte = [0 for i in range(len(str))]
for i in range(len(str)-1, 0, -1):
byte[i-1] = str[i-1] - byte[i]
for i in range(len(byte)):
print(chr(byte[i]), end="")
실행 결과

Uploaded by N2T