**
菜鸡找点题目写写,边写边学习
**
emmm这个可能要给坑掉了,啊这上面做的太少了,如果有兴趣摸安卓的话应该还会回去
自己学习用的,不算很正统的wp,菜鸡随便写写呜呜呜,还有平时看到的一些题目,补一下
1. 攻防世界
pythontrade
python反汇编,用了工具,观察反汇编代码
可以看出flag经过encode这个函数处理在经过base64编码变成了correct
写一下脚本
import base64
flag=""
s="XlNkVmtUI1MgXWBZXCFeKY+AaXNt"
s2=base64.b64decode(s)//base64解码
a=[]
for i in range(len(s2)):
a.append(s2[i]-16)
flag+=chr(a[i]^32)
print(flag)
然后得到flag:nctf{d3c0mpil1n9_PyC}
crackme
先拖进pd发现加了壳:
学习了一下ns脱壳
脱壳之后再拖进:
ida32打开字符串定位主要代码如下:
先判断flag是不是长度是不是42然后与byte_402130里面做异或得到dword_402150中的内容,然后点进这两个查看他们的内容写出脚本
flag=""
a="this_is_not_flag"
b=[0x12,4,8,0x14,0x24,0x5c,0x4a,0x3d,0x56,0x0a,0x10,0x67,0,0x41,0,1,0x46,0x5a,0x44,0x42,0x6e,0x0c,0x44,0x72,0x0c,0x0d,0x40,0x3e,0x4b,0x5f,2,1,0x4c,0x5e,0x5b,0x17,0x6e,0x0c,0x16,0x68,0x5b,0x12,0x48,0x0e]
for i in range(42):
flag+=chr(ord(a[i%16])^b[i])
print(flag)
得到flag:flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}
这题好像可以直接在ida里面写脚本,还没学会。。。现在ida只会f5先慢慢研究吧,等到后面来补充一下。
shuffle
菜鸡就挑着做的人多的题目做做。。。
先查查,32位elf拖进ida
看代码。。好像没有什么,这个代码要怎么解。。
往上看,转换成字符串试试。。。好吧。。。这个居然是在进阶里面的。。嗯。。挺好
把它们都换成字符串就是flag了
key
32位拖进ida,反汇编发现,哇他有点长
correct的字符串,然后到处跟进看看发现这些函数,我都看不懂都好长
决定用od试试
直接打开秒退,那就应该不需要输入
od一开始先运行,显示如下:
发现直接运行出来是whathappen,回看代码发现打开了一个文件,然后我是照着它的目录新建了,新建之后在下图下个断点
运行一下发现
我文件中的(不管我输入的是什么)经过上面的函数会变成如上的字符串,然后转去看代码,找到关键,应该是下面的
这个函数,然后判断对错,这里跟进不太好看,就找到od中相同的地方下断点
运行一下发现结果就直接出现在eax中了
我动态调试还是不太行。。。还得系统性的学习一下
re1-100
查看程序64位,拖进ida静态分析
看到下图
可以看出输入的字符串是42位的,并且是以{53fc275d81…4938ae4efd}的格式
然后观察下面给出的,格式里面好像都有还是连续的,推断出应该是移位之类的,从53fc开始往前移了20个,按移位来试一下的好像就对了
继续分析一下,跟进一下confusekey函数,函数打乱后要与所给出的一致
把输入的字符串十个一组分了四组,分别为1234然后交换顺序变为了3421,上面的推测还是有漏洞,这个是顺位交换的,要是不顺位交换的话,就有可能是错的,做题目的时候还是多加小心。
提交的时候踩了一个坑,把花括号提交上去了,后来发现已经确定了是s[0],s[41]是花括号,提交的时候要去掉
用linux试一下下
对啦
x64elf-100
拖进ida
点进去看这个函数
下面for循环的意思flag是12位的,从v3-v5取其中的2*i/3做循环然后减去输入的flag的一个个字符相差1
根据意思写出py脚本,这题写脚本的时候想了一下,总是想找到简便方法,失败。。。
a="Dufhbmf"
b="pG`imos"
c="ewUglpt"
flag=""
for i in range(11):
if(i%3==0):
flag+=chr(ord(a[2*int(i/3)])-1)
elif(i%3==1):
flag+=chr(ord(b[2*int(i/3)])-1)
elif (i%3==2):
flag+=chr(ord(c[2*int(i/3)])-1)
print(flag)
然后在试一下
对啦
这题已经可以用angr解出来了hhh
IgniteMe
从上面可以看出来flag格式是EIS{…}
然后跟进sub_4011C0这个函数看看
经过两次异或和大小写转换可以得出flag
写出脚本
a="GONDPHyGjPEKruv{{pj]X@rF"
b=[0x0d,0x13,0x17,0x11,0x02,0x01,0x20,0x1d,0x0c,0x02,0x19,0x2f,0x17,0x2b,0x24,0x1f,0x1e,0x16,0x09,0x0f,0x15,0x27,0x13,0x26,0x0a]
f=""
d=""
for i in range (24):
f+=chr(ord(a[i])^b[i])
for i in range (24):
d+=chr((ord(f[i])-72)^0x55)
print(d.swapcase())
swapcase()大小写转化
babyre
elf64位,ida打开,定位主函数,一看,比较明显的smc自解密
exp直接最后再放了,解密之后,f5大法
刚刚出来的有点丑
emmm我们把标识先给隐藏了让他更清楚一点点
这个代码一开始看得我很模糊,后来发现其实蛮简单的,把a1-4当成单纯的一个数就好了,然后看出来sub_600b0c()中少了一位,看看在前的judge()
中,正好是我们flag的f,hhh
exp
#smc
#sea=0x600B00
#for i in range(182):
#PatchByte(sea+i,Byte(sea+i)^0xc)
b=[0]*14
flag=''
a=[102,109,99,100,127,107,55,100,59,86,96,59,110,112]
for i in range(0,14):
b[i]=a[i]^i
#print(b)
for i in range(14):
flag+=chr(b[i])
print(flag)
#print(''.join(chr(b[i]) for i in range(14)))
easyhook
这题有点迷惑性
我们一开始会找成sub_401240()这个函数,点进去
这个一看就很假,退出去,然后感觉hook是一个提示,搜了一波
hook初步学习
点进sub_401220()
看见了一些关键标志
逐步跟进,找到主函数sub_401000()
然后就是普通逆向了
2.别的地方找的题目
安恒四月月赛逆向第二题
查看程序64位elf 拖进ida
找到关键地方,最后输出的是v10与上面给出的十进制数一个个异或,v10是从0开始与你input的v15数组那里一个个异或,就直接爆破了
当时因为晚上还有课,作业还没写完,做的就有点糙
脚本
a=[38,44,33,39,59,35,34,115,117,114,113,33,36,117,118,119,35,120,38,114,117,118,119,35,120,38,114,117,113,38,34,113,114,117,114,36,112,115,118,121,35,37,121,61]
c='flag'
for b in range(0,127):
s=""
for i in range(len(a)):
if(a[i]^b<32 and a[i]^b>127):
break
else:
s+=chr(a[i]^b)
if c in s:
print(s)
2019红帽杯easyRE
要考试了简单写一写,我只解出第一个,第二个解的时候发现是一串网址,一脸懵,然后看了大佬的wp
里面提到了这个,不随机常量
fini段的解释是:
此节区包含了可执行的指令,是进程终止代码的一部分。程序正常退出时,系统将安排执行这里的代码
其实一开始实在没想通为什么会突然想到这个,还是得学习一下,然后应该就会去关注这些的
找到关键代码
简短的exp
off_6cc090="Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJ" //没用
flag1=""
flag2=""
a=[73,111,100,108,62,81,110,98,40,111,99,121,127,121,46,105,127,100,96,51,119,125,119,101,107,57,123,105,121,61,126,121,76,64,69,67]
for i in range(len(a)):
flag1+=chr(a[i]^i)
print(flag1)
key="flag"
byte_6cc0a0=[0x40,0x35,0x20,0x56,0x5d,0x18,0x22,0x45,0x17,0x2f,0x24,0x6e,0x62,0x3c,0x27,0x54,0x48,0x6c,0x24,0x6e,0x72,0x3c,0x32,0x45,0x5b]
key2=""
for i in range(4):
key2+= chr(byte_6cc0a0[i] ^ ord(key[i]))
print(key2)
for i in range(len(byte_6cc0a0)):
flag2+=chr(byte_6cc0a0[i]^ord(key2[i%4]))
print(flag2)
贴一个学习链接:https://www.jianshu.com/p/dd5aec5826da
Wxyvm1
没做过虚拟机逆向,这里先做一个简单的试试
逻辑还是蛮简单的,先对输入的加密然后与给定的数据进行比较
加密过程也挺简单的,直接逆吧,这题主要巩固了一下idapy的使用,ida真的是神器啊,不过ida的远程动调用的不是很习惯,还是在虚拟机里用edb比较好一点点,但是他的字真的好小,下次做题之前调调
a=[0xC4,0X34,0x22,0xB1,0xD3,0x11,0x97,0x7,0xDB,0x37,0xC4,0x6,0x1D,0xFC,0x5B,0xED,0x98,0xDF,0x94,0xD8,0xB3,0x84,0xCC,0x8]
addr=0x6010C0
'''
15000个数据的起始地址
'''
for i in range(14997,-1,-3):
v0=Byte(addr+i)
v3=Byte(addr+i+2)
if v0==1:
result=Byte(addr+i+1)
a[result]-=v3
elif v0==2:
result=Byte(addr+i+1)
a[result]+=v3
elif v0==3:
result=Byte(addr+i+1)
a[result]^=v3
elif v0==4:
result=Byte(addr+i+1)
a[result]/=v3
elif v0==5:
result=Byte(addr+i+1)
a[result]^=a[Byte(addr+i+2)]
else:
continue
flag=''
for j in range(len(a)):
flag+=chr(a[j]%256)
print(flag)
最后加上了%256是因为第一次运行时报错了,以后也要注意
网鼎杯joker
当时没做出来,实在是太困了也是蹭的别的队的题目后面就没看了(去睡觉了×)
主要卡在了修改堆栈之后还是不能反汇编
学习了一下smc,然后解密脚本
sea = 0x401500
for i in range(0,187):
PatchByte(sea+i,Byte(sea+i)^0x41)
可怕的是解完之后依然不能反汇编,但是这个时候看汇编还是能稍微看懂的,连蒙带猜
后面就是我想不到的脑洞了~~
菜啊,安卓真的不会也有一点点不想做。。
3.160creakme
Afkayas
od查看,查找字符串,定位
这个je是关键跳转,直接爆破掉的话不论输入什么都是对的,这个没啥意思,还要继续研究
往上找找,找到栈块入口
在这里下断点,运行,我输入的是123456,22222
返回od从断点处开始f8单步步过,注意堆栈和寄存器的变化
步过上面函数之后堆栈里面出现了我输入的123456
继续单步步过
然后找到了算法
最后激活码就是将AKA-与字符串相连,寄存器直接给出
改天补一个脚本
4.BUUCTF
youngerdrive
这题学习了一下当ida不能f5时一些方法
创建函数和修复sp,参考链接https://bbs.pediy.com/thread-158896.htm
找到主函数,sub_411190()是与他给定的字符串作比较,关键点startAddress跟进之后找到函数sub_411940()却不能f5查看反汇编代码,堆栈不平衡,修改堆栈的值
将-04修改成0x0即可
查看sub_411940()函数
大小写加密,如果是小写,用在off_418000中的位置-38替换,大写雷同
继续看后面的函数
搜了一下是创建线程
结合这两个推测是隔一个加密一次,如果是奇数的话,加密,是偶数的话,不变
脚本如下
a="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasd" //off_418000
b="TOiZiZtOrYaToUwPnToBsOaOapsyS" //off_418004
flag=""
for i in range(len(b)):
if i%2==0:
flag+=b[i]
else:
if(b[i].isupper()): //判断是否是大写
flag+=chr(a.find(b[i])+96)
else:
flag+=chr(a.find(b[i])+38)
print(flag)
得到flag:ThisisthreadofwindowshahaIsES
我当时就以为对了,怎么提交也提交不上去,后来参考一位大佬的wp才发现被坑了,感谢
附上链接:https://l1b0.fun/13356/
发现dword_418008的值为0x1d,也就是说下标从29开始,那就是输入长度有30位,但是只比较了前29位