pwnable.kr第二遍---unlink asm memcpy

本文档详细介绍了在pwnable.kr平台学习过程中的关键知识点,包括unlink技巧、汇编指令的理解与应用、shellcode的生成及调试技巧、memcpy函数的内部实现等,并深入探讨了32位系统下malloc函数分配内存的具体机制。
pwnable.kr需要学会的内容:


>>>>>unlink
如何查看堆栈的内存分布?
查看源代码的汇编:gdb disassemble func
mov和lea的关系
mov的第二个操作是只能是常量,不能是表达式
lea ecx,eax 语法错误
lea ecx,[eax] 将eax的值给ecx,[]中可以是表达式
mov ecx,eax 将eax的值给ecx,第二个操作数不能使表达式u
mov ecx,[eax] eax寄存器中为内存地址,取该地址中的内容给ecx,[]中可以是表达式


>>>>>asm
nasm和ld编译链接
objdump和odfhex导出shellcode


由于只能使用read write open函数
由此不能定义变量如int.....
因此使用esp和eax寄存器的特殊性来操作
pushstr:
结果是将字符串放在esp寄存器中
问题:有的是放在寄存器中,有的却不放,这个和存放的字符串是什么关系??
eax的特殊性:
eax一般作为存储函数的返回值
因此,open('esp')函数的返回值(fd)即存放在eax寄存器中
因此接下来的读取操作就为:read('eax','esp',0x64)
含义为从eax寄存器中的fd中读取0x64长度的字符串到esp寄存器中
write(1,'esp',0x64)即为将esp寄存器长度0x64的字符串标准输出


当我们写open/read/write函数时
借用了pwntools的工具库shellcraft
发送给host的应该为asm汇编代码
于是借用asm工具(asm(shellcode))


p.connect_remote(host,port)
p.send();p.recvline()


问题:connect_remote和process的区别
connect_remote是与某设备的端口通信,如connect_remote('localhost',,port=9026)
process是与某个指定文件进行通信,如process('./unlink')


注意上下文context
由于amd64和i386对于指令的处理方式不同,所以要提前设置context


>>>>>memcpy
学习gdb-peda工具的使用
用gdb来看,发现了出错的位置??
重点:32bit下malloc(a)分配的堆块大小为8*(int((a+4)/8)+1)???
解释:
1.每个chunk头部包含prev_size字段和size字段
2.malloc分配的出的内存是字节对齐的(8/16)
3.当前一个chunk(A)为inuse时,prev_size字段可以与用户数据覆盖,内存复用
Asize决定是否覆盖prev_size:
---if(Asize%(2*size_t)<size_t)则可以复用4bytes
分配给用户的内存大小为:8+int(a/8)*8=8+int((a+4)/8)*8
---if(Asize%(2*size_t)==size_t)则可以复用4bytes
分配给用户的内存大小为:8+int(a/8)*8=8+int((a+4)/8-1)*8-----
---if(Asize%(2*size_t)>size_t)则不能,需要填充字段保证字节对齐
分配给用户的内存大小为:8+(int(a/8)+1)*8=8+int((a+4)/8)*8
4.于是将2中的两种情况综合起来得:
分配给用户的内存大小为8*(int((a+4)/8)+1)这个结论有问题吧???
当刚好余数为size_t时就不符合了


所以如何判断一个size分配之后是否是16bytes对齐?
if(a%(2*size_t)<size_t) 分配后的字节数为8*(int((a+4)/8)+1)
if(a%(2*size_t)>size_t) 分配后的字节数为8*(int((a+4)/8)+1)
if(a%(2*size_t)==size_t) 分配后的字节数为8*(int((a+4)/8)-1+1)


网上找到的总结的比较好的malloc的size:
def malloc_chunk_size(n):
if n<12:
size=16
else:
if(n+4)%8==0:
size=n+4
else:
size=8*(int((n+4)/8)+1)
return size


此外并不是所有的都一定要16bytes对齐
由于fast-memcpy是从len>64的情况下才开始使用movdqa和movntps的
所以当size<64时可以随意输入
只需要注意当size>=64时确保16bytes对齐即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值