제일 위의 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
핵심로직들인데 가장 중요한건 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?}
무지성 브포 했다.