我有点困惑第一个shellcode示例是如何工作的。我通过GDB运行它并且我已经验证它是正确的,但我不确定它最终是如何工作的。这是代码的样子:
char shellcode[] =
"\xeb\x13\x59\x31\xc0\xb0\x04\x31\xdb\x43\x31\xd2\xb2\x0f\xcd\x80"
"\xb0\x01\x4b\xcd\x80\xe8\xe8\xff\xff\xff\x48\x65\x6c\x6c\x6f"
"\x20\x77\x6f\x72\x6c\x64\x0a\x0d";
int main()
{
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
return 0;
}
(实际上我已经将最初生成shell的shellcode替换为打印“Hello world”的shellcode,但这不会产生太大影响。)
如果ret
只有一个整数指针,那么ret
如何才能工作? shellcode本身大约有40个字节!如果有的话,所有<?php
public function importContacts($id)
{
if(isset($_POST["Import"]))
{
$filename=$_FILES["file"]["name"];
$f_extension = explode('.',$filename);
$f_extension = strtolower(end($f_extension));
if($f_extension == 'csv') // for import CSV file
{
$file_tmp_name=$_FILES["file"]["tmp_name"];
if($_FILES["file"]["size"] > 0)
{
$file = fopen($file_tmp_name, "r");
$row = array();
while (($emapData = fgetcsv($file, 10000, ",")) !== FALSE)
{
array_push($row, $emapData);
}
fclose($file);
unset($row[0]);
foreach(array_values($row) as $r){
$data = array(
'gc_group_id' => $id,
'gc_user_id' => $this->session->userdata('userId'),
'gc_name' => @$r[1],
'gc_number' => @$r[0],
'gc_email' => @$r[2],
'gc_added_date' => date('Y-m-d'),
);
$this->user_model->add('groups_contact',$data);
array_push($valid_no, $r[0]);
}
fclose($file);
}
}
if($f_extension == 'xlsx' || $f_extension == 'xls')
{
/* PHPExcel library */
set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');
require_once APPPATH.'third_party/PHPExcel/IOFactory.php';
$file_tmp_name=$_FILES["file"]["tmp_name"];
try {
$objPHPExcel = PHPExcel_IOFactory::load($file_tmp_name);
} catch(Exception $e) {
die('Error loading file :' . $e->getMessage());
}
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
unset($sheetData[1]);
foreach(array_values($sheetData) as $s){
$data = array(
'gc_group_id' => $id,
'gc_user_id' => $this->session->userdata('userId'),
'gc_name' => @$s[B],
'gc_number' => @$s[A],
'gc_email' => @$s[C],
'gc_added_date' => date('Y-m-d'),
);
$this->user_model->add('groups_contact',$data);
array_push($valid_no, $s[A]);
}
}
$msg = 'Contacts Added Successfully ';
}
}
?>
应该retreive是shellcode的前4个字节,而不是执行整个事情!
有人可以向我解释这是如何运作的吗?
答案 0 :(得分:0)
它依赖于编译器(和芯片相关),但我认为发生的事情是它依赖的事实是在堆栈2上的位置从你的自动位置开始变量start是从进程返回时应该跳回的返回地址。它用shellcode []数组的地址替换了那个地址,所以当main()返回时,它会执行那里的指令。