CSICTF 部分逆向wp

RicknMorty

整个看下来逻辑就是,随机出现两个数,找到他们的最小公因数,然后+3求阶乘。(在30s内算完所有即可)

(当时没有用脚本,直接计算器走一波就出来了)
附上脚本:

from pwn import *
from LibcSearcher import *
from struct import pack

context.os='linux'
context.arch='amd64'
context.log_level='debug'

sd=lambda x:io.send(x)
sl=lambda x:io.sendline(x)
ru=lambda x:io.recvuntil(x)
rl=lambda :io.recvline()
ra=lambda :io.recv()
rn=lambda x:io.recv(x)
sla=lambda x,y:io.sendlineafter(x,y)

#求最小公因数
def fun1(a,b):
    r=0
    i=1
    while True:
        if a<i or b<i:
            break        
        if not(a%i) and not(b%i):
            r=i
        i=i+1
    return r

#递归求阶乘
def fun2(a):
    if a!=0:
        return a*fun2(a-1)
    else:
        return 1

io=remote('chall.csivit.com',30827)

while True:
    t=ru(' ')[:-1]
    if t=='fun()':
        break
    a=int(t)
    b=int(rl()[:-1])
    sl(str(fun2(fun1(a,b)+3)))

io.interactive()

Blaise

这题也蛮简单的,可能是因为太后放出了?做的人好少...(此处简述一下逻辑,当时做的时候忘记截图了,也懒得复现了QAQ)

逻辑就是随机给出一个数k,然后输入C(n,m)排列组合(m为上标,n为下标),n为给出的随机数k,m为从0~k(前后其实是对称的),输入正确直接get flag...


从这里开始就都是赛后复现啦:

Vietnam

打开找到主函数:

函数逻辑很简单,就是让str = "HELLO" 就可以了,然后就发现没有办法去直接改变str的值,所以问题的关键还是在于JUMPOUT函数上。

由于地址这样看起来不清晰,所以跑一个python脚本处理一下
这里可以看一下PatchDword函数的意思

然后看回ida的dword_402020,现在就变成这样啦:

看一下对应地址的偏移量,+33为输入的字符,反过来也可以理解为程序将输入的字符减去33然后当作下标索引,跳转到对应地址。

算一下偏移:
地址                        偏移量                 输入字符(偏移量+33)
0x4012a9                 0                          !(33)
0x40120c                 3                          $(36)
0x40122d                10                         +(43)   
0x4012e6                11                         ,(44)
0x40126b                12                         -(45)
0x4012fb                 13                         .(46)
0x40131e                58                         [(91) 
0x401369                60                         ](93)
看一下汇编,就会发现每个地址的作用:

重要的就两个地址:0x4012e6和0x4012fb——第一个是将输入字符放在sa中,第二个是依次把sa的字符放在str中。

结合上面我们就可以知道,输入“,”是将字符放在sa中,输入“ . "就可以把它存在str中,因为要让”HELLO“赋值给str,所以我们需要输入六个字符(包括"\n"):

在终端输入:

 , . , . , . , . , . , .  (键盘输入)
HELLO            (键盘输入)
HELLO            (系统输出)

csictf{xxxxxxxxxxxxxxxxxxxxxxxxx}(系统输出)

get flag! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这个buuctf的Easy Rust高级语言逆向题目中,我们需要对给定的Rust语言程序进行逆向分析,并找到程序的存放在flag变量中的答案。 首先,我们需要使用Rust编译器将给定的源代码进行编译。然后,我们可以使用静态分析和动态调试的方法来分析程序的行为。 通过分析程序的源代码,我们可以看到在main函数中,程序会读取一个名为input的字符串,并将它与一组数字进行逐个比较。如果比较结果为真,程序会将对应位置的flag字符进行替换。 为了分析比较的逻辑,我们可以使用动态调试的工具,如GDB。在GDB中,我们可以在比较之前的位置设置一个断点。然后,我们可以逐步执行程序,并观察变量的值来分析比较的逻辑。 在此题中,我们可以发现比较的逻辑为input[i] == flag[i] + 5。这意味着,我们需要将输入字符串中的每个字符和flag中的每个字符进行比较,比较结果为真则通过。 再进一步观察flag变量,我们会发现flag的初始值为"aaaaaa"。由于我们需要找到正确的flag,我们可以把它作为初始值来尝试不断的迭代,直到找到符合比较逻辑的正确flag。 综上所述,我们可以编写一个脚本来尝试不同的flag值,并与给定的input进行比较,直到找到正确的flag。最后,我们将找到的flag flag{r3v3r53_mUST_8E_"aI1_DONE"} 总结起来,buuctf的Easy Rust高级语言逆向题目通过分析Rust程序的源代码和使用动态调试工具,以及编写一个脚本来找到正确的flag值。通过理解比较逻辑和尝试不同的可能性,我们可以成功地完成这个题目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值