Shellcoder的手册:第一个shellcode示例

时间:2017-09-03 04:52:22

标签: c stack shellcode

我有点困惑第一个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个字节,而不是执行整个事情!

有人可以向我解释这是如何运作的吗?

1 个答案:

答案 0 :(得分:0)

它依赖于编译器(和芯片相关),但我认为发生的事情是它依赖的事实是在堆栈2上的位置从你的自动位置开始变量start是从进程返回时应该跳回的返回地址。它用shellcode []数组的地址替换了那个地址,所以当main()返回时,它会执行那里的指令。