pwn笔记
1.用对应位数的ida打开,shift+f12先来查看一下程序里有的字符串
2. shellcode 用pwntools得到:
print(shellcraft.sh()) 得到汇编代码 //32位程序
print(asm(shellcraft.sh())) 得机器码
pwntools默认为32位,所以用64位程序之前要加
context.arch = "amd64"再使用以下程序
print(shellcraft.amd64.sh()) //64位程序
ldd level3 查看level3调用本地的libc地址 file之后的内容可查看libc的绝对路径
给远端程序发的时候发机器码
------------------------------------------------------------------------------
from pwn import *
elf = ELF("./ret2syscall")
next(elf.search(b"/bin/sh"))
这一系列命令可以查询/bin/sh串的地址
elf.plt["system"] 获取system@plt的地址
strings level3 | grep sh 寻找level3中包含sh的字符串
------------------------------------------------------------------------------
解题思路:
没有后门函(ret2text) --> 没有bss可读可写可执行(ret2shellcode) --> 没有可以用的gadget(ret2syscall) ,有时也要看是不是静态链接
ret2libc :
1.有/bin/sh,直接用plt表中的system函数即可
2.没有/bin/sh,用bss段构造/bin/sh,同时需要用gets()或者其他的相关函数
3.有时候ida中没有/bin/sh,在linux中用 string ret2libc | grep sh 搜索sh,然后截断含有sh的字符串
-------------------------------------------------------------------------------
pwndbg
x (+地址)查看地址的内容
x/20
gdb/pwndbg 常用命令简单整理 - 暖暖草果 - 博客园 (cnblogs.com)
---------------------------------------------------------------------------------
libc.symbols["puts"] 寻找libc中的puts的地址
一个字节一个地址 每一个字节被分配一个地址 不是一个字节等于一个地址
一个地址占4个字节 因为32位cpu访问的内存地址(二进制)都是:由0和1组成的32位数 1b(字节)=8bit(用0或1表示) 32/8=4
ret2libc
ret2libc的payload的两种构造方式
第一种普适性性较强
ret2libc中执行sysgtem函数时,ebp向上两个字节是system函数的参数,一直向上读到他的父函数的ebp截至
payload:
pwntools
对pwntools之recv,send方法的理解_hanqdi_的博客-CSDN博客
objdump -R ret2libc3 显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。