手搓shellcode的学习记录

本文记录了作者学习手动编写shellcode的过程,特别是在面对严格输入限制时如何手动构造shellcode。通过分析2020 NUAA CTF的一道题目,重点探讨了如何在仅允许使用0x1f-0x7f字符的限制下,构造/bin/sh字符串和使用异或技巧构造syscall指令0x050f。分析过程中,作者参考了他人经验并详细解读了关键步骤。
摘要由CSDN通过智能技术生成

虽然我们可以利用pwntools自动生成shellcode,也可以利用alpha生成纯字符的shellcode绕过某些限制,但是当程序对输入限制较为严苛时,就不得不和这些自动化工具说再见了。由于之前完全没有手写shellcode的经验,所以本文主要是理解分析其他师傅的shellcode,尝试从中获得技巧和方法(说得明白点就先从照葫芦画瓢开始。。。)

首先直接来看题,这是2020 NUAA CTF的一道题,主要考点是ascii shellcode,难点在于限制只能用0x1f-0x7f的字符,并且buf长度只有0x40。

image-20200724132428442

虽然程序中if语句的判断是小于31(0x1f),但由于类型为char(长度为8位)当其大于127(0x7f)时,值会变成负数,因此可输入字符范围是0x1f-0x7f。

image-20200724133417628

要构造shellcode最主要的是两个问题,一是构造/bin/sh字符串,二是构造syscall指令(0x050f)。这里/bin/sh比较简单,由于是buf是在在栈上,所以直接push进栈就好了,而且字符范围也符合要求。问题在于syscall指令(0x050f)不符合字符范围要求,根据TaQini师傅的方法是利用异或来绕过限制。直接来看师傅的exp逐步分析吧。

from pwn import *

local_file  = './pwn6'
local_libc  = '/lib/x86_64-linux-gnu/libc.so.6'
remote_libc = local_libc # '../libc.so.6'

is_local = False
is_remote = False

if len(sys.argv) == 1:
    is_local = True
    p = process(local_file)
    libc = ELF(local_libc)
elif len(sys.argv) > 1:</
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值