2019-3-31-上海嘉韦思杯wp-re
re1
看是pe文件,打开ida 打开olldbg
Main函数看到strcmp,输入第一个密码r0b0RUlez!
才发现又要输入第二个密码,这个出乎我的意料
Olldbg动调的时候一层层地F2设断点
通过level1后会调用0x004015EA,在0x004015EA设断点,然后到0x004015ea的int 3之后断了思路
这时候回到IDA搜索scanf之类的输入函数,然后看到了
关键函数在sub_401547
因为if语句里要为1才会输出dword_40ADA4的祝贺语句,所以函数要返回0(!0=1)
所以a1要等于(a2^2)才不会return 1,*a2是40AD98地址所在指针指向的字符串
在od的内存中打开40AD98
找到0x40AD98所在地址的指针(指向0x28FDCC)指向的偏移
将u1nnf21g按位与2后得到w3lld0ne
最后比较坑的一点是两个flag片段之间要加_
所以最终flag:flag{r0b0RUlez!_w3lld0ne}
re2
这一题感觉比较坑,我的IDA有部分函数没办法转成伪代码,动调的时候才知道是从0x08048420开始程序
重点就三句
Jnz要进行跳转,执行下面的0x804848F,Incorrect!已经很明显是错误的了。
为了jnz跳转,就需要之前的test不等于0,因为test eax,eax相当于and eax,eax
所以想要标志位Z不为0,就只需要eax不为0,那样and eax,eax就不会为0
在32位系统中,eax是作为函数的返回值的,所以eax的值取决于sub_8048580函数的返回值,接下来重点分析该函数
这个函数很长,主要就是case 10-122,每次要嘛满足if return,要嘛continue继续下一次循环,函数的功能就是每次循环对比一位你输入的参数,接下来我们要找到return不为0的地方,经过每个return的挑选,我选中了case 107
挑选的依据在于v14在esp+37H的位置,在函数的开头有一个v5[(v3 + 64) % 128] = 1;
其中v5在esp+cH的位置,V3是我们输入的字符串每次循环指向的那一个字符
因为(0x37-0xC-64)%128=107,所以当我们输入107(也就是‘k’)字符的时候v14所在值就会置1,这里值得注意的是每轮循环都会memset,把所有v5之后的栈空间置0,所以每次循环,只会有一个参数等于1,所以不能通过多次循环来满足v14!=0的条件(因为没注意memset是在每轮循环中让我浪费了大量时间),然后就是让v2==12为true,这一点就是一点点逆推了,比如在上一轮中满足case 98,让v2=12,或者从v2=0顺推也行(v2就是我们输入的字符串的下标,根据v3 = *(_BYTE *)(a1 + v2);)
最后构造字符串链48,57,118,100,102,55,119,101, 102,105,106, 98 , 107
得到flag{09vdf7wefijbk}
rsa256
最后附加一个rsa
给了公钥文件和flag文件
公钥直接扔到http://tool.chacuo.net/cryptrsakeyparse
公私钥解密,得到公钥的N和E
之后把模数N转成10进制扔到
http://www.factordb.com 大数分解
拿到q p后,放到脚本里生成私钥
coding=utf-8
import math
import sys
from Crypto.PublicKey import RSA
keypair = RSA.generate(1024)
keypair.p = 273821108020968288372911424519201044333
keypair.q = 280385007186315115828483000867559983517
keypair.e = 65537
keypair.n = keypair.p * keypair.q
Qn = long((keypair.p-1) * (keypair.q-1))
i = 1
while (True):
x = (Qn * i ) + 1
if (x % keypair.e == 0):
keypair.d = x / keypair.e
break
i += 1
private = open(‘private.pem’,’w’)
private.write(keypair.exportKey())
private.close()
该脚本来自https://blog.csdn.net/qq_31481187/article/details/70448108
之后用命令openssl rsautl -decrypt -in flag.enc -inkey private.pem -out flag.dec得到flag文件flag.dec
评论加载中