测试文件:https://www.lanzous.com/i7303oh

1.准备

获取信息:

  • 32位文件

2.IDA打开

找到主函数之后,反编译为伪C代码

  1. int sub_404D70()
  2. {
  3. int result; // eax
  4. char v1; // [esp+0h] [ebp-58h]
  5. char v2[]; // [esp+18h] [ebp-40h]
  6. char v3; // [esp+28h] [ebp-30h]
  7. char v4[]; // [esp+2Ch] [ebp-2Ch]
  8. char v5; // [esp+3Ch] [ebp-1Ch]
  9. int v6; // [esp+40h] [ebp-18h]
  10. size_t v7; // [esp+44h] [ebp-14h]
  11. int i; // [esp+48h] [ebp-10h]
  12. int v9; // [esp+54h] [ebp-4h]
  13.  
  14. sub_404EF0("------360CTF------\n", v1);
  15. sub_404EF0("Please input fl@g:", v1);
  16. sub_404F30("%s", (unsigned int)Str);
  17. v7 = strlen(Str);
  18. if ( v7 == )
  19. {
  20. sub_401F20(&v1);
  21. v9 = ;
  22. for ( i = ; i < ; ++i )
  23. {
  24. v4[i] = Str[i];
  25. v2[i] = byte_4080A8[i];
  26. }
  27. v5 = ;
  28. v3 = ;
  29. if ( (unsigned __int8)((int (__cdecl *)(char *, signed int))loc_404600)(v4, ) && (unsigned __int8)sub_404860(v2) )
  30. {
  31. sub_404EF0("Congratulations!!!", v1);
  32. system("PAUSE");
  33. v9 = -;
  34. sub_401FD0(&v1);
  35. result = ;
  36. }
  37. else
  38. {
  39. sub_404EF0("Wrong!!!", v1);
  40. v6 = ;
  41. v9 = -;
  42. sub_401FD0(&v1);
  43. result = v6;
  44. }
  45. }
  46. else
  47. {
  48. sub_404EF0("wrong format!!!", v1);
  49. result = ;
  50. }
  51. return result;
  52. }

从第18行代码,我们能够得知flag(输入字符串)长度应该为32

代码的第26行loc_404600(v4, 16) && sub_404860(v2)很明显就是我们需要关注的两个函数,但是打开loc_404600(v4, 16)

  1. .text: loc_404600: ; CODE XREF: sub_404D70+D3p
  2. .text: ; DATA XREF: TlsCallback_0:loc_404552o ...
  3. .text: cmp ch, ah
  4. .text: mov ds, word ptr [edx+edx*]
  5. .text: push es
  6. .text: adc [ecx], ebp
  7. .text: sub eax, 6DD7066Eh
  8. .text:0040460D outsb
  9. .text:0040460E bound esi, [esi+3Dh]
  10. .text: or ch, bl
  11. .text: push ebx
  12. .text: insd
  13. .text: outsb
  14. .text: bound esi, [esi-14h]
  15. .text: adc dl, 76h
  16. .text:0040461C insd
  17. .text:0040461D outsb
  18. .text:0040461E movsd
  19. .text:0040461F xor eax, [ecx+6D76626Eh]
  20. .text: push es
  21. .text: cdq
  22. .text: pop ss
  23. .text: sub eax, 0E13BEF6Eh
  24. .text:0040462D xchg bh, [esi+ebp*]
  25. .text: xchg eax, edx
  26. .text: xchg eax, ecx
  27. .text: movsd
  28. .text: xor edx, [ecx+6D76626Eh]
  29. .text: push es
  30. .text:0040463A inc ecx
  31. .text:0040463B adc al, 2Dh
  32. .text:0040463D outsb
  33. .text:0040463E out dx, eax
  34. .text:0040463F cmp ecx, ecx
  35. .text: xchg ch, [eax]
  36. .text: scasb
  37. .text: xchg eax, edx
  38. .text: xchg eax, ecx
  39. .text: movsb
  40. .text: xor edx, [ecx+0F160A6Fh]

于是尝试用OD进行动态调试,并和IDA中的伪C代码作比较

3. OD 动态调试

一句一句分析理解,直接上代码和注释了

3.1 loc_404600函数

输入“abcdefghijklmnopqrstuvwxyz123456”作为测试,第56行找到了loc_404600函数,进入

  1. push ebp
  2. 8BEC mov ebp,esp
  3. 6A FF push -0x1
  4. 735F4000 push test.00405F73
  5. 0040460A :A1 mov eax,dword ptr fs:[]
  6. push eax ; eax=0x19FF1C
  7. : >mov dword ptr fs:[],esp
  8. 81EC B0000000 sub esp,0xB0 ; 为局部变量申请栈空间
  9. 0040461E C745 EC >mov dword ptr ss:[ebp-0x14],0x0 ; 原本指向flag16个字符
  10. FB614000 push test.004061FB ; 指向开头的字符串--360CTF...
  11. 0040462A 8D4D 8C lea ecx,dword ptr ss:[ebp-0x74]
  12. 0040462D E8 5ED8FFFF call test.00401E90
  13. C745 FC >mov dword ptr ss:[ebp-0x4],0x0
  14. push test.
  15. 0040463E 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C] ; 0x19fe60其中的值为0x0F
  16. E8 4AD8FFFF call test.00401E90
  17. C645 FC mov byte ptr ss:[ebp-0x4],0x1 ; 下面的字符串压入了0x19FE00=EBP-0xC0
  18. 0040464A push test. ; ASCII "12345679"
  19. 0040464F 8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C]
  20. E8 36D8FFFF call test.00401E90 ; 返回的eax="123456789"
  21. 0040465A C645 FC mov byte ptr ss:[ebp-0x4],0x2
  22. 0040465E C745 E8 6C62400>mov dword ptr ss:[ebp-0x18],test.>; ASCII "greatctf"
  23. 8D4D F3 lea ecx,dword ptr ss:[ebp-0xD]
  24. E8 F3D6FFFF call test.00401D60
  25. 0040466D C645 FC mov byte ptr ss:[ebp-0x4],0x3
  26. 8B45 E8 mov eax,dword ptr ss:[ebp-0x18]
  27. push eax ; 将新赋值的eax="greatctf"压入栈中
  28. E8 call <jmp.&api-ms-win-crt-string-l1--.>; 计算长度strlen
  29. 0040467A 83C4 add esp,0x4
  30. 0040467D 8BC8 mov ecx,eax ; ecx=8
  31. 0040467F 8B45 EC mov eax,dword ptr ss:[ebp-0x14] ; eax=[ebp-0x14]
  32. 33D2 xor edx,edx ; edx清零
  33. F7F1 div ecx ; [ebp-0x14]/8
  34. 8B45 E8 mov eax,dword ptr ss:[ebp-0x18] ; eax="greatctf"
  35. 0FBE0C10 movsx ecx,byte ptr ds:[eax+edx] ; eax=“greatctf”的第edx(这里相当于是[ebp-0x14]%8的值)个字节放入ecx
  36. 0040468D 8B55 mov edx,dword ptr ss:[ebp+0x8] ; edx="abcdefghijklmnop"flag16个字符
  37. EC add edx,dword ptr ss:[ebp-0x14] ; edx=edx+0
  38. 0FBE02 movsx eax,byte ptr ds:[edx] ; edx="abc..."的第edx([ebp-0x14])个字节放入eax
  39. 33C1 xor eax,ecx ; greatctf"的首字母与"abcd.."的首字母做异或
  40. 8B4D mov ecx,dword ptr ss:[ebp+0x8] ; ecx="abcdefghijklmnop"的地址
  41. 0040469B 034D EC add ecx,dword ptr ss:[ebp-0x14] ; ecx=ecx+0---有点怀疑是个循环操作了
  42. 0040469E mov byte ptr ds:[ecx],al ; 将异或结果保存到"abcd..."的首字符处
  43. 004046A0 8B55 EC mov edx,dword ptr ss:[ebp-0x14] ; edx=0
  44. 004046A3 83C2 add edx,0x1 ; edx=edx+1
  45. 004046A6 EC mov dword ptr ss:[ebp-0x14],edx ; 更新[ebp-0x14]中的值为edx
  46. 004046A9 8B45 EC mov eax,dword ptr ss:[ebp-0x14] ; 将[ebp-0x14]赋值到eax
  47. 004046AC 3B45 0C cmp eax,dword ptr ss:[ebp+0xC] ; eax与16比较,截取的部分flag的长度
  48. 004046AF ^ 7C C0 jl Xtest. ; 小于就跳回上面,继续执行异或操作
  49. 004046B1 83EC sub esp,0x18 ; 获取大小为0x18的栈空间
  50. 004046B4 8BCC mov ecx,esp
  51. 004046B6 D0 mov dword ptr ss:[ebp-0x30],esp ; 将esp=0x19FDEC存入0x19FE90
  52. 004046B9 8B55 mov edx,dword ptr ss:[ebp+0x8] ; 将0x19fefc存入edx
  53. 004046BC push edx ; edx入栈,0x19fde8,[ebp-d8],edx的地址指向的值是异或后的结果
  54. 004046BD E8 CED7FFFF call test.00401E90
  55. 004046C2 CC mov dword ptr ss:[ebp-0x34],eax ; eax=0x19FDEC,即异或后的地址存入0x19FE8C
  56. 004046C5 C645 FC mov byte ptr ss:[ebp-0x4],0x4 ; 0x4存入0x19febc
  57. 004046C9 6A 2A push 0x2A ; 将0x2a压入栈中
  58. 004046CB 83EC sub esp,0x18 ; esp=0x19fdd0
  59. 004046CE 8BCC mov ecx,esp
  60. 004046D0 C8 mov dword ptr ss:[ebp-0x38],esp
  61. 004046D3 8B45 mov eax,dword ptr ss:[ebp+0x8]
  62. 004046D6 push eax ; eax=0x19fefc
  63. 004046D7 E8 B4D7FFFF call test.00401E90
  64. 004046DC 8D8D 5CFFFFFF lea ecx,dword ptr ss:[ebp-0xA4] ; ecx=0x19fe1c
  65. 004046E2 push ecx
  66. 004046E3 C645 FC mov byte ptr ss:[ebp-0x4],0x3 ; 0x3存入0x19febc
  67. 004046E7 8D4D F3 lea ecx,dword ptr ss:[ebp-0xD] ; ecx=0x19feb3
  68. 004046EA E8 51F0FFFF call test. ; 自身平方
  69. 004046EF E4 mov dword ptr ss:[ebp-0x1C],eax ; eax=0x19fe1c
  70. 004046F2 8B55 E4 mov edx,dword ptr ss:[ebp-0x1C] ; edx=0x19fe1c
  71. 004046F5 E0 mov dword ptr ss:[ebp-0x20],edx
  72. 004046F8 8B45 E0 mov eax,dword ptr ss:[ebp-0x20] ; eax=0x19fe1c
  73. 004046FB push eax
  74. 004046FC 8D4D 8C lea ecx,dword ptr ss:[ebp-0x74] ; ecx=0x19fe4c
  75. 004046FF E8 0CD9FFFF call test.
  76. 8D8D 5CFFFFFF lea ecx,dword ptr ss:[ebp-0xA4] ; ecx=0x19fe1c
  77. 0040470A E8 C1D8FFFF call test.00401FD0
  78. 0040470F 83EC sub esp,0x18 ; esp=0x19fdec
  79. 8BCC mov ecx,esp
  80. C4 mov dword ptr ss:[ebp-0x3C],esp ; [0x19fe84]=0x19fdec
  81. 8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C] ; edx="12345679"的地址0x19fe34
  82. 0040471D push edx ; edx入栈
  83. 0040471E E8 CDD6FFFF call test.00401DF0
  84. C0 mov dword ptr ss:[ebp-0x40],eax ; eax为"12345679"的地址,赋值到[0x19fe80]
  85. C645 FC mov byte ptr ss:[ebp-0x4],0x5 ; [0x19febc]=0x5
  86. 0040472A 6A 2A push 0x2A ; 2a入栈
  87. 0040472C 83EC sub esp,0x18
  88. 0040472F 8BCC mov ecx,esp
  89. BC mov dword ptr ss:[ebp-0x44],esp ; [0x19fe7c]=0x19fdd0
  90. 8D45 8C lea eax,dword ptr ss:[ebp-0x74] ; 取")*0990510578848262884380342813696"的地址0x19fe4c存入eax
  91. push eax
  92. E8 B3D6FFFF call test.00401DF0
  93. 0040473D 8D8D 44FFFFFF lea ecx,dword ptr ss:[ebp-0xBC] ; ecx=0x19fe04
  94. push ecx
  95. C645 FC mov byte ptr ss:[ebp-0x4],0x3 ; [0x19febc]=0x3
  96. 8D4D F3 lea ecx,dword ptr ss:[ebp-0xD] ; ecx=0x19feb3
  97. 0040474B E8 F0EFFFFF call test. ; 与123456789相乘
  98. DC mov dword ptr ss:[ebp-0x24],eax ; "'-+4823339700468499618579595434614979584"的地址eax=0x19fe04
  99. 8B55 DC mov edx,dword ptr ss:[ebp-0x24] ; edx=0x19fe04
  100. D8 mov dword ptr ss:[ebp-0x28],edx ; [0x19fe98]=0x19fe04
  101. 8B45 D8 mov eax,dword ptr ss:[ebp-0x28] ; eax=0x19fe04
  102. 0040475C push eax ; eax入栈
  103. 0040475D 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C] ; ecx=0x19fe64
  104. E8 ABD8FFFF call test.
  105. 8D8D 44FFFFFF lea ecx,dword ptr ss:[ebp-0xBC] ; ecx=0x19fe04
  106. 0040476B E8 60D8FFFF call test.00401FD0
  107. 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C] ; ecx=0x19fe64
  108. E8 48FEFFFF call test.004045C0
  109. D4 mov dword ptr ss:[ebp-0x2C],eax ; 将"'-+4823339700468499618579595434614979584"的地址0x5d68d0存入0x19fe94
  110. 0040477B 8B4D D4 mov ecx,dword ptr ss:[ebp-0x2C] ; ecx=0x19fe94
  111. 0040477E push ecx ; s2="'-+4823339700468499618579595434614979584"
  112. 0040477F push test. ; s1="667339003789000121539302795007135856775"地址入栈
  113. E8 0B150000 call <jmp.&api-ms-win-crt-string-l1--.>; strcmp
  114. 83C4 add esp,0x8
  115. 0040478C 85C0 test eax,eax
  116. 0040478E jnz Xtest.004047D1

地址004046EA ,调用test.00403740,进入之后可以找到一段平方的代码

  1. 0040287B 8B55 F0 mov edx,dword ptr ss:[ebp-0x10] ; 循环跳转位置
  2. 0040287E 83EA sub edx,0x1
  3. F0 mov dword ptr ss:[ebp-0x10],edx
  4. 837D F0 cmp dword ptr ss:[ebp-0x10],0x0
  5. 0F8C jl test. ; 循环结束条件
  6. 0040288E 8B45 F0 mov eax,dword ptr ss:[ebp-0x10]
  7. push eax
  8. 8D4D 0C lea ecx,dword ptr ss:[ebp+0xC]
  9. E8 16F8FFFF call test.004020B0
  10. 0040289A 0FBE08 movsx ecx,byte ptr ds:[eax] ; 将低位的一字节移动到ecx
  11. 0040289D 83E9 sub ecx,0x30
  12. 004028A0 8BC1 mov eax,ecx
  13. 004028A2 0FAF45 E0 imul eax,dword ptr ss:[ebp-0x20]
  14. 004028A6 E8 add eax,dword ptr ss:[ebp-0x18]
  15. 004028A9 cdq
  16. 004028AA B9 0A000000 mov ecx,0xA
  17. 004028AF F7F9 idiv ecx
  18. 004028B1 D8 mov dword ptr ss:[ebp-0x28],edx
  19. 004028B4 8B55 F0 mov edx,dword ptr ss:[ebp-0x10]
  20. 004028B7 push edx
  21. 004028B8 8D4D 0C lea ecx,dword ptr ss:[ebp+0xC]
  22. 004028BB E8 F0F7FFFF call test.004020B0
  23. 004028C0 0FBE00 movsx eax,byte ptr ds:[eax] ; 将低位的一字节移动到eax
  24. 004028C3 83E8 sub eax,0x30 ; 将字符转换为整型数据
  25. 004028C6 0FAF45 E0 imul eax,dword ptr ss:[ebp-0x20] ; 从低位开始一位一位的自身相乘
  26. 004028CA E8 add eax,dword ptr ss:[ebp-0x18]
  27. 004028CD cdq
  28. 004028CE B9 0A000000 mov ecx,0xA
  29. 004028D3 F7F9 idiv ecx
  30. 004028D5 E8 mov dword ptr ss:[ebp-0x18],eax
  31. 004028D8 8D55 lea edx,dword ptr ss:[ebp-0x7C]
  32. 004028DB push edx
  33. 004028DC 8B45 D8 mov eax,dword ptr ss:[ebp-0x28]
  34. 004028DF 83C0 add eax,0x30 ; 整型转换为字符
  35. 004028E2 push eax
  36. 004028E3 8D8D 48FFFFFF lea ecx,dword ptr ss:[ebp-0xB8]
  37. 004028E9 push ecx
  38. 004028EA E8 01E8FFFF call test.004010F0
  39. 004028EF 83C4 0C add esp,0xC
  40. 004028F2 C8 mov dword ptr ss:[ebp-0x38],eax
  41. 004028F5 8B55 C8 mov edx,dword ptr ss:[ebp-0x38]
  42. 004028F8 push edx
  43. 004028F9 8D4D lea ecx,dword ptr ss:[ebp-0x7C]
  44. 004028FC E8 0FF7FFFF call test.
  45. 8D8D 48FFFFFF lea ecx,dword ptr ss:[ebp-0xB8]
  46. E8 C4F6FFFF call test.00401FD0
  47. 0040290C ^ E9 6AFFFFFF jmp test.0040287B ; 进行下一个循环

同样的,第97行代码,对字符串乘12345679也是一样

3.2 处理总结

在第109行~第113行代码,这就是一个将输入字符串前16个字符处理之后(先异或"greatctf",再自身平方,最后乘以12345679),与"667339003789000121539302795007135856775"比较。

因此,我们只需要逆向处理,就能得到输入字符的前16个字符

4.脚本处理

  1. str1 = "greatctf"
  2. num2 = 667339003789000121539302795007135856775
  3. flag=""
  4.  
  5. num2 = num2 // 12345679
  6. num2 = pow(num2, 0.5)
  7. str2 = str(num2)
  8.  
  9. for i in range(16):
  10. flag += chr(ord(str2[i]) ^ ord(str1[i%8]))
  11. print(flag)

得到前16个字符

PAPSETGQ_FRRBQLS

5. sub_404860函数

  1. v33 = &v21;
  2. v32 = (int *)&v25;
  3. v31 = (int *)&v23;
  4. v30 = &v22;
  5. v21 = *a1;
  6. v25 = a1[];
  7. v26 = ;
  8. v23 = a1[];
  9. v24 = ;
  10. LOWORD(v22) = *((_WORD *)a1 + );
  11. BYTE2(v22) = *((_BYTE *)a1 + );
  12. *(_DWORD *)((char *)&v22 + ) = *((unsigned __int8 *)a1 + );
  13. HIBYTE(v22) = ;
  14. srand(0xBC6146u);
  15. v29 = rand() % ;
  16. v20 = rand() % ;
  17. v27 = rand() % ;
  18. v28 = rand() % ;
  19. v1 = sub_404FC0(v25, v26, , );
  20. v3 = v2;
  21. LODWORD(v4) = sub_404FC0(v29, HIDWORD(v29), , );
  22. if ( v21 + __PAIR__(v3, v1) - v4 != 0x1A06491E7i64 )
  23. goto LABEL_9;
  24. v5 = sub_404FC0(v27, HIDWORD(v27), v23, v24);
  25. v7 = v6;
  26. LODWORD(v8) = sub_404FC0(v25, v26, v20, HIDWORD(v20));
  27. if ( __PAIR__(v7, v5) - v8 != 0x244BFD2B9Ci64
  28. || (v9 = sub_404FC0(v23, v24, v28, HIDWORD(v28)),
  29. v11 = v10,
  30. LODWORD(v12) = sub_404FC0(v22 + , (unsigned __int64)(v22 + ) >> , v29, HIDWORD(v29)),
  31. v12 + __PAIR__(v11, v9) != 0x71CE119D5i64)
  32. || (v13 = sub_404FC0(v28, HIDWORD(v28), , ),
  33. v15 = sub_404FC0(v13, v14, v22, HIDWORD(v22)),
  34. v17 = v16,
  35. LODWORD(v18) = sub_404FC0(v27, HIDWORD(v27), v21, HIDWORD(v21)),
  36. __PAIR__(v17, v15) - v18 != 0x431E9A36840i64) )
  37. {
  38. LABEL_9:
  39. result = ;
  40. }
  41. else
  42. {
  43. result = ;
  44. }
  45. return result;
  46. }

5.1 代码分析

第14行代码~第18行代码,在生成随机数,这些数在后面也会用到,因此可以写一个生成随机数的程序。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int main(){
  6. int v15,v8,v14,v13;
  7.  
  8. srand(0xbc6146);
  9. v15 = rand() % ;
  10. v8 = rand() % ;
  11. v13 = rand() % ;
  12. v14 = rand() % ;
  13.  
  14. cout << v15 << " " << v8 << " " << v13 << " " << v14 << endl;
  15.  
  16. return ;
  17. }

输出

2 11 192 31

又因为这个函数要返回1,使得上一层的判断成立,因此我们要让27~36行代码不成立。则,利用z3包,我们能够写出脚本

5.2 脚本获取

引用官方的WP给出的脚本

  1. from z3 import *
  2. import struct
  3. s = [Int('serial%d' % i) for i in range()]
  4. z3 = Solver()
  5.  
  6. v1 =
  7. v2 =
  8. v3 =
  9. v4 =
  10.  
  11. z3.add(*s[]-*v1+s[] == )
  12. z3.add(v3*s[]-s[]*v2 == )
  13. z3.add(s[]*v4+(+s[])*v1 == )
  14. z3.add(v4**s[]-v3*s[] == )
  15.  
  16. print(z3.check())
  17. answer=z3.model()
  18. res = ""
  19. for d in s:
  20. num = answer.eval(d).as_long()
  21. res += struct.pack('<L', num)
  22. print(repr(res))

得到

simpleRe__360CTF

6.get flag!

两段组合

PAPSETGQ_FRRBQLSsimpleRe__360CTF

参考

1.https://mp.weixin.qq.com/s?__biz=MzUzNjYxNjQ3Ng==&mid=2247487016&idx=5&sn=4661d0ce40c10ce97be8a62ea4e8386e&chksm=faf2c55bcd854c4dfd0e1ab15a5195f4e86856212aaa5d7541a5642cd9efd525a645e2683738&mpshare=1&scene=23&srcid=&sharer_sharetime=1572355740318&sharer_shareid=30036028ee2a193ffdd181bf24ece3f8#rd

2.https://www.cnblogs.com/harmonica11/p/11723241.html

2019 360杯 re wp--Here are some big nums的更多相关文章

  1. 2019红帽杯部分wp

    xx 程序首先取输入的前4个字符作为xxtea加密的密钥之后进行xxtea加密.接着进行位置置换操作,然后又进行了以3个为一组的异或 首先逆向解出xxtea加密之后的结果 #include<st ...

  2. 2019 红帽杯 Re WP

    0x01 xx 测试文件:https://www.lanzous.com/i7dyqhc 1.准备 获取信息 64位文件 2.IDA打开 使用Findcrypt脚本可以看到 结合文件名是xx,因此猜测 ...

  3. [BUUCTF]REVERSE——[2019红帽杯]easyRE

    [2019红帽杯]easyRE 附件 步骤: ida载入,没有main函数,就先检索了程序里的字符串 发现了base64加密的特征字符串,双击you found me跟进,找到了调用它的函数,函数很长 ...

  4. 第二届360杯全国大学生信息安全技术大赛部分解题思路(WEB安全)

    第一题如下: 用burpsuit设置好代理后,点击发送验证码,可以看到如下: 然后go之后可以看到如下的验证码: 提交验证码后即可获得key 第二题如下: 通过/data/mysql_error_tr ...

  5. 2019 湖湘杯 Reverse WP

    0x01 arguement 下载链接:https://www.lanzous.com/i7atyhc 1.准备 获取到信息: 32位的文件 upx加密文件 在控制台打开文件 使用"upx ...

  6. 2019"深思杯"山东省大学生网络安全技能大赛部分wp

    签到 载入OD查看字符串 上下左右 这道题出来的时候真的是一点思路都没有,一直以为是什么编码来着,看了大佬们的 wp 原来是画图 拿大佬的脚本: from PIL import Image im = ...

  7. 2019强网杯babybank wp及浅析

    前言 2019强网杯CTF智能合约题目--babybank wp及浅析 ps:本文最先写在我的新博客上,后面会以新博客为主,看心情会把文章同步过来 分析 反编译 使用OnlineSolidityDec ...

  8. 记 2019蓝桥杯校内预选赛(JAVA组) 赛后总结

    引言 好像博客好久没更新了 哈哈哈哈哈 趁现在有空更新一波 不知道还有没有人看 确实该记录一下每天做了什么了 不然感觉有些浑浑噩噩了 比赛介绍 全称: 蓝桥杯全国软件和信息技术专业人才大赛 蓝桥杯 实 ...

  9. 2019 蓝桥杯省赛 A 组模拟赛(一)-修建公路

    题目: 蒜头国有 nn 座城市,编号分别为 0,1,2,3,...,n-1.编号为 x 和 y 的两座城市之间如果要修高速公路,必须花费 x|y 个金币,其中|表示二进制按位或. 吝啬的国王想要花最少 ...

随机推荐

  1. [算法]概率与期望DP

    前言 前两节主要针对题目分析,没时间的珂以跳过. 初步 首先举一道简单.经典的好题: [Lightoj1038]Race to 1 Again 懒得单独写,安利一下DennyQi同学的博客:https ...

  2. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

  3. 【Leetcode】位1的个数

    解题方案:位操作的技巧 整数 n 和 n-1(n>0) 做与运算,从其二进制形式来看,可以消掉 n 的二进制数值中最后1个 “1” .循环进行,每次消掉1个 “1” .整数 n 的二进制数值中有 ...

  4. gridbagsizer

    #coding:utf-8 import wx labels='1 2 3 4 5 6 7 8 9 '.split() class TestFrame(wx.Frame): def __init__( ...

  5. Linux基本命令使用(三)

    1.压缩解压命令:gzip,   .gz格式的 gzip 文件名     就压缩了. Linux压缩的放到Windows下可以解压,但是Windows下压缩到Linux解压就不一定可以. (1)只能压 ...

  6. 拦截器中,request中getReader()和getInputStream()只能调用一次,构建可重复读取inputStream的request.

    由于 request中getReader()和getInputStream()只能调用一次 在项目中,可能会出现需要针对接口参数进行校验等问题. 因此,针对这问题,给出一下解决方案 实现方法:先将Re ...

  7. [BZOJ3033]:太鼓达人(爆搜)

    题目传送门 题目描述 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和lyd ...

  8. 不能访问windows installer服务

    xp系统安装msi类型的安装程序出现以下错误: 不能访问windows installer服务. 解决办法 1:运行cmd -> regsvr32 msi.dll 运行services.msc- ...

  9. open jdk卸载

    //查找:open jdk # rpm -qa | grep java //卸载open jdk # rpm -e --nodeps 包 # source /etc/profile # java -v ...

  10. Hook基本知识

    一.什么是HOOK(钩子) Windows系统,建立在事件驱动机制上,就是整个系统都是通过消息传递实现的.hook(钩子)是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往目标 ...