逆向持续学习(持续更新)

**

菜鸡找点题目写写,边写边学习

**
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壳去学习一下
学习了一下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位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值