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   显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。

posted @ 2020-11-20 18:19  ATKevin  阅读(147)  评论(0编辑  收藏  举报