C 当试图手动触发竞赛条件时,ln失败

C 当试图手动触发竞赛条件时,ln失败,c,race-condition,exploit,C,Race Condition,Exploit,这只是一种锻炼。我不是想利用什么东西… 我有一个setuid玩具程序要利用(反编译版本): 但我从脚本中得到以下错误: ln: failed to create symbolic link '/tmp/expolitme': File exists ln: cannot remove '/tmp/expolit': No such file or directory 我已经使用了ln的-f选项来强制创建符号链接。为什么会出现这些错误?问题在于调用ln的方式--同时调用多个实例。ln“强制”符号

这只是一种锻炼。我不是想利用什么东西…

我有一个setuid玩具程序要利用(反编译版本):

但我从脚本中得到以下错误:

ln: failed to create symbolic link '/tmp/expolitme': File exists
ln: cannot remove '/tmp/expolit': No such file or directory

我已经使用了
ln
的-f选项来强制创建符号链接。为什么会出现这些错误?

问题在于调用
ln
的方式--同时调用多个实例。
ln
“强制”符号链接的方式是,它取消链接(删除)目标并重新创建它。但是您同时调用了多个
ln
实例,这会导致与对
ln
的其他调用产生竞争条件。因为一个或多个实例取消了与
tmp/exploitme
的链接,但其他一些实例已经创建了新的
/tmp/exploitme
;所以“文件存在”。如果不在后台生成多个
ln
实例,则不会观察到此问题

让我们用两个实例来展示一个示例:A和B

Instance A                           Instance B 

Calls ln                             Calls ln 

Deletes /tmp/expolitme if exists     Deletes /tmp/expolitme if exists

Creates /tmp/expolitme

                                     Creates /tmp/expolitme 
                                     (File exists - because A created it already)

错误源于脚本,而不是C程序,对吗?Post应该标记为Linux、脚本。不是Cyes,错误来自脚本,C代码与文章完全无关。同样奇怪的是,您在创建漏洞时公开请求帮助。这只是一个练习。我不是想利用什么。。。对不起,我应该指出这一点。
ln: failed to create symbolic link '/tmp/expolitme': File exists
ln: cannot remove '/tmp/expolit': No such file or directory
Instance A                           Instance B 

Calls ln                             Calls ln 

Deletes /tmp/expolitme if exists     Deletes /tmp/expolitme if exists

Creates /tmp/expolitme

                                     Creates /tmp/expolitme 
                                     (File exists - because A created it already)