Rev
Patchwork
作者提示patch即可
这个程序应该只给出标志,但我在代码中设置了错误的值,现在它拒绝跳转到正确的函数。你能帮我打补丁吗?
蹦床很有趣!我喜欢跳跃!你也应该尝试跳跃!这肯定会比手动反转标志更有趣。
查看函数,有名为give_flag
的函数,推测应该是patch将控制流由main
函数改为give_flag
函数
笔者选择直接修改_star
函数使程序的入口点直接跳转到give_flag
函数
查看_start函数的汇编代码,红框所示代表将main函数地址设为入口点,
gdb调试观察,汇编代码中的CE
代表main
函数和rip
的偏移,因此,只需要计算出give_flag
函数和rip
的偏移并将CE替换即可
IDA查看main函数的地址为0x1139
give_flag函数的地址为0x117D
计算偏移为 0x117D - 0x1139 = 0x44
CE + 44 = 112
因此将 CE patch为 112,并保存运行
成功得到flag
也可以直接修改main函数中的隐藏的跳转,使其成功跳转
Python Garbage Compiler
题目代码:
import string # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+++++.++++.+++.-.+++.++.<<++.>>-.+.--.---------.+++++.-------.
from random import * # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.++++++++++++.---.--.<<++.>>+++++.-----------------.+++++++++++++.----------.+++++++++++.--.<<.>>----.++++.+++.-.+++.++.<<.++++++++++.
def finalstage(w): # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>.+.+.<<++.>>.+++.+++++.-------------.+++++++++++.+++++++.+.-------------------.++++++.--.<<++++++++.>>++++++++++++++++++.<<+.>------------.
h=0 # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++.<---------.-------------.
w = list(w) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+++++++++++++++++++.<<++.>---------.<.>>-----------.---.++++++++++.+.<<++++++++.>>+++.<<+.
w.reverse() # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+++++++++++++++++++.<<++++++++++++++++.>>-----.-------------.+++++++++++++++++.-----------------.+++++++++++++.+.--------------.<<------.+.
w = "".join(g for g in w) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+++++++++++++++++++.<<++.>---------.<.++..++++++++++++.>>-------------.+++++.------.+++++.<<------.>>-------.<<--------.>>-.+++++++++.+++.<<.>>-----------.<<.>>++.+++++.<<.>>+++++++++.<<+++++++++.
flag = 'flag'.replace('flag', 'galf').replace('galf', '') # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.++++++.-----------.++++++.<<++.>---------.<.+++++++.>>-.++++++.-----------.++++++.<<.+++++++.>>+++++++++++.-------------.+++++++++++.----.-----------.++.++.<<------.-.>>+.++++++.-----------.++++++.<<.+++++.------------.+++++++.>>.------.+++++++++++.------.<<.++.+++++.>>++++++++++++.-------------.+++++++++++.----.-----------.++.++.<<------.-.>>++.------.+++++++++++.------.<<.+++++.------------.+++++++..++.
while h < len(w): # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+++++++++++++++++++.---------------.+.+++.-------.<<++.>>+++.<<.>----------.<.>>++++.-------.+++++++++.<<++++++++.>>+++++++++.<<+.>--.
try: # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++++++.--.+++++++.<------------.
flag += w[h+1] + w[h] # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.++++++.-----------.++++++.<<++.+++++++++++.>---------.<-----------.>>++++++++++++++++.----------------------------.+++++++++++++.<<+++++++++++.++++++.>>-----------.<<-----------------.+++++++++++.-----------.>>++++++++++++++++++++++++++.----------------------------.+++++++++++++.-----------.
except: # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+.+++++++++++++++++++.---------------------.++.+++++++++++.++++.<------------.
flag += w[h] # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.++++++.-----------.++++++.<<++.+++++++++++.>---------.<-----------.>>++++++++++++++++.----------------------------.+++++++++++++.-----------.
h+=2 # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++.<<+++++++++++++.>---------.<+++++++.
print("Final Stage complete") # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++.++.---------.+++++.++++++.<<++++++++++.------.>.>-----------.+++++.-------------.+++++++++++.<<--.>+++++++++++++.>++++++++.<++++++++++++++.++++++.--.<.>--.>-----.--.+++.----.<++.>++++++++.<.<++.+++++++.
return flag # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++++.-------------.+++++++++++++++.+.---.----.<<++.>>--------.++++++.-----------.++++++.
def stage2(b): # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>.+.+.<<++.>>+++++++++++++.+.-------------------.++++++.--.<<++++++++++++++++++.----------.>>---.<<+.>------------.
t = "++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.++++++.-----------.++++++."[-15:(7*9)].strip('-') # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++++++.<<++.>---------.<.++.+++++++++..........>>-------------------------.<+.<.>.<...>.<.......>.<..........>--....<++.>>++.<++....<--..+++.---......+++.-...........+.---......+++.------------.>>--.<<+++++++++++.++++.++++.>----.<-------------.>---.<++.>++.<-.>>++.<<+++++.>>++++++++++++++++++++++.+.--.---------.+++++++.<<------.-.++++++.------.++.
for q in range(len(b)): # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.+++++++++.+++.<<++.>>-.<<.>>--------.+++++.<<.>>++++.-----------------.+++++++++++++.-------.--.<<++++++++.>>+++++++.-------.+++++++++.<<.>>------------.<<+..>------------.
t += chr(ord(b[q])-randint(0,5)) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++++++.<<++.+++++++++++.>---------.<-----------.>>-----------------.+++++.++++++++++.<<++++++++.>>---.+++.--------------.<<.>>--.-------.++++++++++++++++++++++.--------------------.<<+.++++.>>+++++++++++++++++++++.-----------------.+++++++++++++.----------.+++++.+++++.++++++.<<-----.++++++++.----.>--------.<---..
print("Stage 2 complete") # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++.++.---------.+++++.++++++.<<++++++++++.------.>+++++++++++++.>.<++++++++++++++.++++++.--.<--.++++++++++++++++++.------------------.>--.>-----.--.+++.----.<++.>++++++++.<.<++.+++++++.
flag = finalstage(t) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.++++++.-----------.++++++.<<++.>---------.<.>>-.+++.+++++.-------------.+++++++++++.+++++++.+.-------------------.++++++.--.<<++++++++.>>+++++++++++++++.<<+.
return flag # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++++.-------------.+++++++++++++++.+.---.----.<<++.>>--------.++++++.-----------.++++++.
def stage1(a): # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>.+.+.<<++.>>+++++++++++++.+.-------------------.++++++.--.<<+++++++++++++++++.---------.>>----.<<+.>------------.
a = list(a) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>---.<<++.>---------.<.>>+++++++++++.---.++++++++++.+.<<++++++++.>>-------------------.<<+.
b = list(string.ascii_lowercase) # abcdefghijklmnopqrstuvwxyz
for o in range(len(a)): # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.+++++++++.+++.<<++.>>---.<<.>>------.+++++.<<.>>++++.-----------------.+++++++++++++.-------.--.<<++++++++.>>+++++++.-------.+++++++++.<<.>>-------------.<<+..>------------.
a[o] = chr(ord(a[o])^o) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>---.------.++++++++++++++++++++.------------------.<<++.>---------.<.>>++++++.+++++.++++++++++.<<++++++++.>>---.+++.--------------.<<.>>---.------.++++++++++++++++++++.------------------.<<+.>>+.+++++++++++++++++.<<
z = "".join(x for x in a) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++++++++++++.<<++.>---------.<.++..++++++++++++.>>----------------.+++++.------.+++++.<<------.>>++++++++++.<<--------.>>------------------.+++++++++.+++.<<.>>++++++.<<.>>---------------.+++++.<<.>>-------------.<<+++++++++.
for y in range(len(z)): # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.+++++++++.+++.<<++.>>+++++++.<<.>>----------------.+++++.<<.>>++++.-----------------.+++++++++++++.-------.--.<<++++++++.>>+++++++.-------.+++++++++.<<.>>++++++++++++.<<+..>------------.
b[y%len(b)] = chr((ord(z[y])^ord(a[y]))+len(b)) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>--.-------.++++++++++++++++++++++++++++++.<<+++++++.>>-------------.-------.+++++++++.<<+++.>>------------.<<+.>>-----.<<---------.>---------.<.>>++++++.+++++.++++++++++.<<++++++++..>>---.+++.--------------.<<.>>++++++++++++++++++++++.<++++++++++++++++++++++++++++++.>-.<++.<+.>+.>----------.+++.<++++++.<-.>---.------.>+++++++.<++.<+..++.>>-------------.-------.+++++++++.<<---.>+++++.<+..
print("Stage 1 complete") # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++.++.---------.+++++.++++++.<<++++++++++.------.>+++++++++++++.>.<++++++++++++++.++++++.--.<--.+++++++++++++++++.-----------------.>--.>-----.--.+++.----.<++.>++++++++.<.<++.+++++++.
flag = stage2(z) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.++++++.-----------.++++++.<<++.>---------.<.>>++++++++++++.+.-------------------.++++++.--.<-----------.<++++++++.>>+++++++++++++++++++++.<<+.
return flag # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++++.-------------.+++++++++++++++.+.---.----.<<++.>>--------.++++++.-----------.++++++.
def entry(f): # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>.+.+.<<++.>>-.+++++++++.++++++.--.+++++++.<<++++++++.>>-------------------.<<+.>------------.
seed(10) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+++++++++++++++.--------------..-.<<++++++++++.+++++++++.-.-------.
f = list(f) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.<<++.>---------.<.>>++++++.---.++++++++++.+.<<++++++++.>>--------------.<<+.
f.reverse() # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.<<++++++++++++++++.>>++++++++++++.-------------.+++++++++++++++++.-----------------.+++++++++++++.+.--------------.<<------.+.
f = "".join(i for i in f) # 逆序 ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.<<++.>---------.<.++..++++++++++++.>>++++.+++++.------.+++++.<<------.>>-----.<<--------.>>---.+++++++++.+++.<<.>>---------.<<.>>.+++++.<<.>>--------.<<+++++++++.
print("Entry complete") # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++.++.---------.+++++.++++++.<<++++++++++.------.>-.>------.++++++.--.+++++++.<<--.>>----------------------.++++++++++++.--.+++.----.-------.+++++++++++++++.---------------.<<++.+++++++.
flag = stage1(f) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.++++++.-----------.++++++.<<++.>---------.<.>>++++++++++++.+.-------------------.++++++.--.<------------.<++++++++.>>+.<<+.
return flag # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++++.-------------.+++++++++++++++.+.---.----.<<++.>>--------.++++++.-----------.++++++.
if __name__ == '__main__':# ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+++++.---.<<++.>>-------..+++++++++++++++.-------------.++++++++++++.--------.------..<<.>---------..<.+++++++.>>..++++++++++++++.------------.++++++++.+++++.---------------..<<.>---.
input = entry(input("Enter Flag: ")) # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+++++.+++++.++.+++++.-.<<++.>---------.<.>>---------------.+++++++++.++++++.--.+++++++.<<++++++++.>>----------------.+++++.++.+++++.-.<<.------.>++++++++.>------.++++++.---------------.+++++++++++++.<<--.>+.>------.-----------.++++++.<------------.<.++.+++++++..
flag = open('output.txt', 'r').readlines()[0] # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++.++++++.-----------.++++++.<<++.>---------.<.>>++++++++.+.-----------.+++++++++.<<++++++++.-.>>+.++++++.-.----.+++++.-.<<+++++++.>>.++++.----.<<-------.+++++.------------.+++++++.>>--.<<.++.+++++.>>.-------------.----.+++.++++++++.---.+++++.---------.++++++++++++++.<<------.+.>>------------------------.<<+++++++.>>++.
if input == flag: # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+++++.---.<<++.>>+++.+++++.++.+++++.-.<<.>---------..<.>>--------------.++++++.-----------.++++++.<---.
print("What... how?") # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++.++.---------.+++++.++++++.<<++++++++++.------.>+++++++++++++++++.>------------.-------.+++++++++++++++++++.<<++++++++++++...--------------.>>------------.+++++++.++++++++.<------------------------.<++.+++++++.
print("I guess you broke my 'beautiful' code :(") # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++.++.---------.+++++.++++++.<<++++++++++.------.>+++.<--.>>-------------.++++++++++++++.----------------.++++++++++++++..<<.>>++++++.----------.++++++.<<.>>-------------------.++++++++++++++++.---.----.------.<<.>>++++++++.++++++++++++.<<.+++++++.>>-----------------------.+++.----.++++++++++++++++++++.-.-----------.---.+++++++++++++++.---------.<<.-------.>>---------.++++++++++++.-----------.+.<<.>---------------.<++++++++.------.+++++++.
else: # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>+.+++++++.+++++++.--------------.<------------.
print("haha, nope. Try again!") # ++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++.++.---------.+++++.++++++.<<++++++++++.------.>>------------.-------.+++++++.-------.<<++++++++++.------------.>>+++++++++++++.+.+.-----------.<<++++++++++++++.--------------.>++++++++++++++.>+++++++++++++.+++++++.<<.>+++++++++++++.++++++.------.++++++++.+++++.<+.+.+++++++.
三个阶段逐个分析进行逆向,
def nfinalstage():
s = "^seqVVh+]>z(jE=%oK![b$\\NSu86-8fXd0>dy"
print(len(s))
flag = ''
h=0
while(h<len(s)):
try:
flag += s[h+1] + s[h]
except:
flag += s[h]
h+=2
flag = list(flag)
flag.reverse()
s = "".join(g for g in flag)
return s
print(nfinalstage())
print("stage2------------------------")
print(stage2("asdfghjk"))
def nstage2():
seed(10)
t = ''
b = "y>dd0fX-886Su\\Nb$![oK=%jEz(]>h+VVeq^s"
for q in range(len(b)):
p = randint(0,5)
# print(p)
t += chr(ord(b[q])+p)
return t
print(nstage2())
print(stage2("}>gg4fY0;:;Tu`Qd$\"`qK@&nG}+_Cj.W[gv`t") == "y>dd0fX-886Su\\Nb$![oK=%jEz(]>h+VVeq^s")
def nstage1():
z = "}>gg4fY0;:;Tu`Qd$\"`qK@&nG}+_Cj.W[gv`t"
z = list(z)
for o in range(len(z)):
z[o] = chr(ord(z[o])^o)
a = "".join(x for x in z)
return a
print(nstage1())
a = list(nstage1())
a.reverse()
a = "".join(x for x in a)
print(a)