jarvis oj DebugMe writeup

来源:互联网 发布:粉尘防护口罩知乎 编辑:程序博客网 时间:2024/06/06 18:38

话说这题真的是玄学做出来的。。。

首先看一波main函数

这里写图片描述

sub_A30这里是fork了一个子进制,然后调用ptrace post了一些东西到子进程那里

然后这里就是异或了一波输入的东西

接着在下面看到有这个东西,也是输入异或了一波

这里写图片描述

这里的判断条件有点看得不是很懂,这里也不多说。。。免得误导

这里写图片描述

这里插了一个breakpoint,目测就是跟上面子进程那里有关

在sub_c14里面就是主要的判断逻辑的地方

这里写图片描述

v3就是传进来的第二个参数,就是7

然后根据v3的顺序来判断输入的字符串是否正确,根据题目所说,有8个字符,这里应该所有判断条件都要用上

在case9那个label 那里就是更新v3的地方,这里的反编译成c语言的结果有点问题

看了下arm的汇编,准确的是

v3=7 * (v3 + 1) - 11*sub_E14(7 * (v3 + 1), 11)

然后编个程序,看下验证的顺序,发现是 7 1 3 6 5 9 4 2 只验证了7个字母,这里感觉就有点奇怪了

于是想动态调试一波

把所有可疑的反调试的全部nop掉

然后开了安卓虚拟机,用gdbserver 调了一下,发现的确是这个顺序。。。感觉就更奇怪了。。。

于是想了想,是不是输入的第二个参数不是7,而是其他呢?

又跑了下,发现输入为0的时候,完整的验证了8个字母 ,然后这个时候就能猜测出上面那个可疑的breakpoint和fork的程序到底干了啥,目测就是停在这个breakpoint,然后父进程把输入的参数改成0,再继续运行验证

然后关键上面有两个异或的操作,到底真正执行了哪一个呢?

这个时候爆破一波就可以了,总共的可能性也不多

代码如下,s4就是flag

a=[105,115,101,110,103,97,114,100]b=[i^1 for i in a]c=[b[i]^i for i in range(len(b))]d=[a[i]^i for i in range(len(a))]s1=''s2=''s3=''s4=''for i in range(len(a)):    s1+=chr(a[i])    s2+=chr(b[i])    s3+=chr(c[i])    s4+=chr(d[i])print(s1)print(s2)print(s3)print(s4)