Hacking/리버싱 소수전공

복습겸 쓰는 리버싱 기초 Write UP

ursobad 2021. 8. 2. 05:45

제일 위의 4문제는 전 포스팅에서 풀었으니 다음문제들부터 차근차근 작성해봐야겠다

문제 수가 생각보다 많아서 두세개로 끊어서 작성하게 될 것 같다.

 

end or null?

binary : whatisend / linux / 64bit

 

로직 자체가 굉장히 간단하다. 그냥 리스트 가져와서 xor역연산 해줬다.

v6 = [67, 95, 0, 48, 43, 28, 13, 58, 58, 11, 10, 59, 54, 26, 44, 37, 31, 23, 29, 48, 48, 29, 45, 49, 27, 25, 0, 83, 63]
flag = ''
for i in range(33,127):
    flag = chr(i)
    for j in range(29):
        flag+=chr(ord(flag[j])^v6[j])
    print(flag)

머가 엄청 많이 나오는데 그중 가장 flag같은걸 찾아보면 s0oo_the_end_is_zero_or_null?가 나오게 된다.

 

quackme

binary : quackme / linux / 32bit

핵심 로직인것 같다.

i + 134514776의 주소의 값과 입력값을 xor해서 greetingMessage과 비교하는거 같으니까 그냥 다 가져와서 역연산 하면 될것 같다.

 

table1 = [0x29, 0x06, 0x16, 0x4F, 0x2B, 0x35, 0x30, 0x1E, 0x51, 0x1B, 0x5B, 0x14, 0x4B, 0x08, 0x5D, 0x2B, 0x50, 0x14, 0x5D, 0x00, 0x19, 0x17, 0x59, 0x52, 0x5D]

greetingMessage = "You have now entered the Duck Web, and you',27h,'re in for a honk"
flag = ''
for i in range(len(table1)):
	flag+=chr(table1[i]^ord(greetingMessage[i]))

print(flag)
# ( greetingMessage[i] == (*(i + 134514776) ^ s[i]) )
# picoCTF{qu4ckm3_5f8d9c17}

 

avap

binary : avap / linux / 64bit

strcmp_

핵심로직들인데 가장 중요한건 key값이다. key값을 브포해도 찾을수 있지만 함수들을 잘 살펴보면 check함수를 찾을 수 있는데 여기서 key값을 만든다.

위의 if문을 풀어서 key값을 찾고 "akf`|3tXb32~X3tX6sX`4stz"과 xor하면 풀릴 것 같다.

from z3 import *
z = Solver()

v4 = Int('v4')

z.add(v4 * (v4 - 14) == -49,v4 <= 24)
z.check()
print(z.model())

# [v4 = 7]

z3로 슥싹 해보면 key가 7인것을 알 수 있다. 이제 걍 무지성 xor하면 된다.

 

a = 'akf`|3tXb32~X3tX6sX`4stz'

key = 7
flag = ''
for i in range(len(a)):
	flag+=chr(ord(a[i])^key)
print(flag)

# flag{4s_e45y_4s_1t_g3ts}

 

end_linux

binary : check_linux / linux / 64bit

먼가 값을 쌓은다음에 비교하는것 같은데 어짜피 target이 flag인것 같으니까 그냥 동적디버깅으로 target값을 까보면 될 것 같다.

아이다 디버깅을 사용했다.

target에 값이 쌓여 flag가 나온다.

 

wwwww

binary : mm / linux / 64bit

핵심 로직인것 같다.

일단 정연산을 먼저 짜려고 했는데 그냥 짜려고 보니까 걍 브포돌릴게 보여서 걍 돌렸다. 시드 고정시켜놓고 돌리면 되는데 이때 0xffff해주는거랑 word로 테이블 뽑는거에서 삽질을 좀 많이 했다.

 

from ctypes import *
import string

libc = CDLL('libc.so.6')
libc.srand(0x17A3)
table1 = [0x73A8, 0x39CC, 0x4E0A, 0x8D85, 0xD1F2, 0x7776, 0x272E, 0xAB31, 0x8F34, 0x4659, 0xE7AC, 0xA308, 0x154D, 0x7D9F, 0x7123, 0xF8DB, 0x49C4, 0x5BB8, 0x2274, 0xDD76, 0xC29D, 0x7048, 0x52AE, 0x1361, 0xC98C, 0x73A6, 0x870A, 0x8870, 0x748D, 0x0669, 0x8C8F, 0xE8A9, 0x40B1, 0xDABF, 0x76C7, 0x133D, 0x52B2, 0x9E59, 0xBE76, 0xE248, 0xE4DD, 0xA6C5, 0x856E, 0xFAB7, 0x2465, 0xF6F7, 0xF41C, 0x6E93, 0x535A, 0x16DA, 0x4C54, 0x166D, 0x87A4, 0x9F0F, 0x29DD, 0x51A3, 0x1327, 0x003A]
flag = ''
for i in range(len(table1)):
    v4 = libc.rand()&0xffff
    for j in range(33,128):
        tmp = v4*j%(v4+1)
        if tmp==table1[i]:
            flag+=chr(j)

print(flag)

#dimi{ca1cul4t3d_inv3rs3?_0r_us3d_z3?_0h_y0u_ar3_4_F0Ol_;)}

 

 345y? 

binary : TooEASY.exe / windows / 32bit

이전문제랑 거의 유사한 형태이다. 그냥 윈도우 랜덤값만 뽑을줄 알면 끝나는 문제이다.

 

from ctypes import *

libc = CDLL('msvcrt')
libc.srand(0x3FD1CC7)

Str2 = [0x4D,0x0CB,0x0C3,0x0BB,0x19,0x0A,0x1A,0x7F,0x50,0xF8,0x18,0x08,0x89, 0x0C1,0x0A8,0x0CF,0x0BA,0x0BE,0x0EC,0x75,0x90,0x0E2,0x23,0x6D,0x0A4,0x0B7,0x35,0x0F5,0x0D1,0x9A,0x32,0x1A,0x8E]
flag = ''
for i in range(len(Str2)):
    v4 = libc.rand()%256
    for j in range(33,128):
        if (v4|j) &((255 - (v4 & j))%256) == Str2[i]:
            flag+=chr(j)
print(flag)

# dimigo{warmup?_nooo_coldup_isit?}

무지성 브포 했다.