sweetchip's blog




binary

invalid-file



코드게이트에 출제된 윈도우 리버싱 문제이다.


다른 팀의 풀이를 보고 한숨 나왔다... 내가 삽질 한거구나.. -_-


프로그램은 자신을 400번이나 재 실행하는 프로그램이다.


프로그램을 분석해보면 재 실행 하는 과정 중 다음 복제할 프로그램의 인자를 생성하고 받은 인자로 키배열로 추정되는 배열을 연산시킨다.


ag1 = 0xA8276BFA

ag2 = 0x92F837ED


ror=lambda x, y: ((x & 0xFFFFFFFF) >> y) | (x << (32-y2)) & 0xFFFFFFFF

rol=lambda x, y: (x << y) & 0xFFFFFFFF | ((x & 0xFFFFFFFF) >> (32-y2))


def ROR(x, y):

x=bin(x & 0xFFFFFFFF)[2:].zfill(32)

start=x[:-y]

end=x[-y:]

return eval('0b' end start)

def ROL(x, y):

x=bin(x & 0xFFFFFFFF)[2:].zfill(32)

start=x[:y]

end=x[y:]

return eval('0b' end start)


def f_401280(a1, a2):

v4 = 1

i = 0

for i in range(0, a2):

v4 *= a1

return v4&0xffffffff


def wtf(str, a1, a2):

v3 = len(str) 1;

v6 = ""

for i in range(0, v3-1, 2):

v6 = chr(int(a1 & 0xff) ^ ord(str[i]))

a1 = ROL(a1, 5) ^ 0x2f

if str[i 1] == "":

break

v6 = chr(int(a2 & 0xff) ^ ord(str[i 1]))

a2 = (a1&0xff) ^ ROL(a2, 11)

return v6


if __name__ == '__main__':

ag3 = 1

flag = 0

key = "\x0F\x8E\x9E\x39\x3D\x5E\x3F\xA8\x7A\x68\x0C\x3D\x8B\xAD\xC5\xD0\x7B\x09\x34\xB6\xA3\xA0\x3E\x67\x5D\xD6"

newag1 = 0

newag2 = 0

newag3 = 1


f = open("result_last.txt", "wb")


for i in range(0, 400):

if i != 0:

ag1 = newag1

ag2 = newag2

ag3 = newag3

result = wtf(key, ag1, ag2)

ag1 = ag1 ^ 0xb72af098

tempag2 = ag1

ag1 *= ag2

ag1 ^= ag2

temp_ag1= ag1 & 0xffffffff

ag1 &= 0xffffffff

ag2 = tempag2

r2 = ""


f.write(result "\n")


ag1 = (29 * ag2 7 * f_401280(ag2, 2)) & 0xffffffff

ag2 = f_401280(ag1 ^ temp_ag1, ag1 % 2 5) & 0xffffffff


ttemp_ag2 = 0

exitcode = 0

if tempag2 >= 0xd0000000:

exitcode = 13 * (ag1 / 27) ^ 0x1f2a990d

ag1 = exitcode

ag2 = newag2


if flag == 0:

ag2 = f_401280(exitcode ^ ag2, exitcode % 30)

ag2 = 0

flag = 1

else:

ag2 = f_401280(newag2 ^ exitcode, exitcode % 30)


ttemp_ag2 = ag2

ag3 = 1

newag1 = ag1

newag2 = ag2

newag3 = ag3

f.close()



코드가 상당히 더러운편인데 그 만큼 멘붕을 했다는 뜻이다.





다른 풀이방법을 생각해보면 함수를 코드패치 해서 messagebox를 띄우는 방법이 있는 등 다른 좋은 방법이 많을 것이다.


대회 당시에도 생각을 하긴 햇지만 이미 코드는 반이상 짜둔터라 그냥 진행 하기로 했었다. [에휴]


신고

Comment 2