@TOC
{}
在复现hitcon cclemon前,先复习一下python的字节码
python字节码
字节码格式:
源码行号 | 指令偏移量 | 指令符号 | 指令参数 | 实际参数值
python3.6之前 每条指令三个字节
python3.6开始每条指令两个字节(大部分)
常见的字节码指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| LOAD_GLOBAL LOAD_FAST LOAD_CONST LOAD_ATTR
ROT_TWO
STORE_FAST STORE_GLOBAL BUILD_LIST
BUILD_SLICE BINARY_SUBSCR STORE_SUBSCR
SETUP_LOOP JUMP_ABSOLUTE:
POP_JUMP_IF_FALSE : JUMP_FORWARD COMPARE_OP
PRINT_NEWLINE CALL_FUNCTION
LOAD_CONST 2 (None) RETURN_VALUE >>>
|
实例:
1 2 3 4 5 6 7 8 9 10
| import angr
p=angr.Project("justamat",auto_load_libs=False) state=p.factory.entry_state() sm=p.factory.simulation_manager(state) res=sm.explore(find=0x4047FD,avoid=0x404753)
if len(res.found) > 0: print (res.found[0].posix.dumps(0))
|
python2的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| 1 0 LOAD_CONST 0 (-1) 3 LOAD_CONST 1 (None) 6 IMPORT_NAME 0 (angr) 9 STORE_NAME 0 (angr)
3 12 LOAD_NAME 0 (angr) 15 LOAD_ATTR 1 (Project) 18 LOAD_CONST 2 ('justamat') 21 LOAD_CONST 3 ('auto_load_libs') 24 LOAD_NAME 2 (False) 27 CALL_FUNCTION 257 30 STORE_NAME 3 (p)
4 33 LOAD_NAME 3 (p) 36 LOAD_ATTR 4 (factory) 39 LOAD_ATTR 5 (entry_state) 42 CALL_FUNCTION 0 45 STORE_NAME 6 (state)
5 48 LOAD_NAME 3 (p) 51 LOAD_ATTR 4 (factory) 54 LOAD_ATTR 7 (simulation_manager) 57 LOAD_NAME 6 (state) 60 CALL_FUNCTION 1 63 STORE_NAME 8 (sm)
6 66 LOAD_NAME 8 (sm) 69 LOAD_ATTR 9 (explore) 72 LOAD_CONST 4 ('find') 75 LOAD_CONST 5 (4212733) 78 LOAD_CONST 6 ('avoid') 81 LOAD_CONST 7 (4212563) 84 CALL_FUNCTION 512 87 STORE_NAME 10 (res)
8 90 LOAD_NAME 11 (len) 93 LOAD_NAME 10 (res) 96 LOAD_ATTR 12 (found) 99 CALL_FUNCTION 1 102 LOAD_CONST 8 (0) 105 COMPARE_OP 4 (>) 108 POP_JUMP_IF_FALSE 138
9 111 LOAD_NAME 10 (res) 114 LOAD_ATTR 12 (found) 117 LOAD_CONST 8 (0) 120 BINARY_SUBSCR 121 LOAD_ATTR 13 (posix) 124 LOAD_ATTR 14 (dumps) 127 LOAD_CONST 8 (0) 130 CALL_FUNCTION 1 133 PRINT_ITEM 134 PRINT_NEWLINE 135 JUMP_FORWARD 0 (to 138) >> 138 LOAD_CONST 1 (None) 141 RETURN_VALUE
|
python3的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| 1 0 LOAD_CONST 0 (0) 2 LOAD_CONST 1 (None) 4 IMPORT_NAME 0 (angr) 6 STORE_NAME 0 (angr)
3 8 LOAD_NAME 0 (angr) 10 LOAD_ATTR 1 (Project) 12 LOAD_CONST 2 ('justamat') 14 LOAD_CONST 3 (False) 16 LOAD_CONST 4 (('auto_load_libs',)) 18 CALL_FUNCTION_KW 2 20 STORE_NAME 2 (p)
4 22 LOAD_NAME 2 (p) 24 LOAD_ATTR 3 (factory) 26 LOAD_ATTR 4 (entry_state) 28 CALL_FUNCTION 0 30 STORE_NAME 5 (state)
5 32 LOAD_NAME 2 (p) 34 LOAD_ATTR 3 (factory) 36 LOAD_ATTR 6 (simulation_manager) 38 LOAD_NAME 5 (state) 40 CALL_FUNCTION 1 42 STORE_NAME 7 (sm)
6 44 LOAD_NAME 7 (sm) 46 LOAD_ATTR 8 (explore) 48 LOAD_CONST 5 (4212733) 50 LOAD_CONST 6 (4212563) 52 LOAD_CONST 7 (('find', 'avoid')) 54 CALL_FUNCTION_KW 2 56 STORE_NAME 9 (res)
8 58 LOAD_NAME 10 (len) 60 LOAD_NAME 9 (res) 62 LOAD_ATTR 11 (found) 64 CALL_FUNCTION 1 66 LOAD_CONST 0 (0) 68 COMPARE_OP 4 (>) 70 POP_JUMP_IF_FALSE 94
9 72 LOAD_NAME 12 (print) 74 LOAD_NAME 9 (res) 76 LOAD_ATTR 11 (found) 78 LOAD_CONST 0 (0) 80 BINARY_SUBSCR 82 LOAD_ATTR 13 (posix) 84 LOAD_ATTR 14 (dumps) 86 LOAD_CONST 0 (0) 88 CALL_FUNCTION 1 90 CALL_FUNCTION 1 92 POP_TOP >> 94 LOAD_CONST 1 (None) 96 RETURN_VALUE
|
cclemon lemon字节码
又见southwood大哥手撕字节码,赶快学习一波~
和python的字节码类似,不过我门先要简单了解一下lemon语言和他的字节码
lemon-documentation
题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
| 0: const 26 ; <module 'src'> 5: module 15 833 11: const 27 ; 68694329 16: store 0 0 19: const 28 ; w 24: define 0 0 0 0 59 33: load 1 0 36: const 29 ; 1259409 41: mul 42: const 30 ; 321625345 47: add 48: const 31 ; 4294967296 53: mod 54: dup 55: store 1 0 58: return 59: store 0 1 62: const 32 ; n 67: const 33 ; __init__ 72: define 0 0 1 2 157 81: array 0 86: self 87: const 34 ; a 92: setattr 93: const 35 ; 0 98: store 0 1 101: load 0 1 104: load 0 0 107: lt 108: jz 151 113: self 114: const 34 ; a 119: getattr 120: const 36 ; append 125: getattr 126: load 1 1 129: call 0 131: call 1 133: pop 134: load 0 1 137: const 37 ; 1 142: add 143: store 0 1 146: jmp 101 151: const 38 ; nil 156: return 157: const 33 ; __init__ 162: const 39 ; x 167: const 40 ; y 172: const 41 ; r 177: define 0 0 2 2 277 186: load 0 0 189: load 0 1 192: gt 193: jz 214 198: self 199: const 41 ; r 204: getattr 205: load 0 0 208: load 0 1 211: tailcall 2 213: return 214: load 0 0 217: load 0 1 220: lt 221: jz 271 226: self 227: const 42 ; s 232: getattr 233: load 0 1 236: load 0 0 239: call 2 241: pop 242: load 0 0 245: const 37 ; 1 250: add 251: store 0 0 254: load 0 1 257: const 37 ; 1 262: sub 263: store 0 1 266: jmp 214 271: const 38 ; nil 276: return 277: const 41 ; r 282: const 39 ; x 287: const 40 ; y 292: const 42 ; s 297: define 0 0 2 3 362 306: self 307: const 34 ; a 312: getattr 313: load 0 0 316: getitem 317: store 0 2 320: self 321: const 34 ; a 326: getattr 327: load 0 1 330: getitem 331: self 332: const 34 ; a 337: getattr 338: load 0 0 341: setitem 342: load 0 2 345: self 346: const 34 ; a 351: getattr 352: load 0 1 355: setitem 356: const 38 ; nil 361: return 362: const 42 ; s 367: const 39 ; x 372: const 40 ; y 377: const 43 ; val 382: const 44 ; o 387: define 0 0 3 4 494 396: load 0 0 399: load 0 1 402: gt 403: jz 427 408: self 409: const 44 ; o 414: getattr 415: load 0 2 418: load 0 0 421: load 0 1 424: tailcall 3 426: return 427: load 0 0 430: store 0 3 433: load 0 3 436: load 0 1 439: le 440: jz 488 445: self 446: const 34 ; a 451: getattr 452: load 0 3 455: getitem 456: load 0 2 459: bxor 460: self 461: const 34 ; a 466: getattr 467: load 0 3 470: setitem 471: load 0 3 474: const 37 ; 1 479: add 480: store 0 3 483: jmp 433 488: const 38 ; nil 493: return 494: const 44 ; o 499: const 45 ; A 504: class 8 0 507: store 0 2 510: const 46 ; 200000 515: store 0 7 518: load 0 2 521: load 0 7 524: call 1 526: store 0 8 529: const 35 ; 0 534: store 0 9 537: load 0 9 540: load 0 7 543: const 47 ; 5 548: mul 549: lt 550: jz 727 555: load 0 1 558: call 0 560: const 48 ; 3 565: mod 566: store 0 10 569: load 0 1 572: call 0 574: load 0 7 577: mod 578: store 0 11 581: load 0 1 584: call 0 586: load 0 7 589: mod 590: store 0 12 593: load 0 10 596: const 35 ; 0 601: eq 602: jz 630 607: load 0 8 610: const 41 ; r 615: getattr 616: load 0 12 619: load 0 11 622: call 2 624: pop 625: jmp 710 630: load 0 10 633: const 37 ; 1 638: eq 639: jz 667 644: load 0 8 647: const 42 ; s 652: getattr 653: load 0 12 656: load 0 11 659: call 2 661: pop 662: jmp 710 667: load 0 10 670: const 49 ; 2 675: eq 676: jz 710 681: load 0 1 684: call 0 686: store 0 13 689: load 0 8 692: const 44 ; o 697: getattr 698: load 0 13 701: load 0 12 704: load 0 11 707: call 3 709: pop 710: load 0 9 713: const 37 ; 1 718: add 719: store 0 9 722: jmp 537 727: const 35 ; 0 732: store 0 14 735: const 35 ; 0 740: store 0 9 743: load 0 9 746: load 0 7 749: lt 750: jz 802 755: load 0 14 758: load 0 8 761: const 34 ; a 766: getattr 767: load 0 9 770: getitem 771: load 0 9 774: const 37 ; 1 779: add 780: mul 781: add 782: store 0 14 785: load 0 9 788: const 37 ; 1 793: add 794: store 0 9 797: jmp 743 802: const 23 ; <function 'print'> 807: const 50 ; hitcon{ 812: load 0 14 815: const 51 ; __string__ 820: getattr 821: call 0 823: add 824: const 52 ; } 829: add 830: call 1 832: pop
|
翻译后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
| 0: const 26 ; <module 'src'> 5: module 15 833
11: const 27 ; 68694329 16: store 0 0
19: const 28 ; w 24: define 0 0 0 0 59 33: load 1 0 36: const 29 ; 1259409 41: mul 42: const 30 ; 321625345 47: add 48: const 31 ; 4294967296 53: mod 54: dup 55: store 1 0 58: return
59: store 0 1 62: const 32 ; n 67: const 33 ; __init__ 72: define 0 0 1 2 157 81: array 0 86: self 87: const 34 ; a 92: setattr 93: const 35 ; 0 98: store 0 1 101: load 0 1 104: load 0 0 107: lt 108: jz 151 113: self 114: const 34 ; a 119: getattr 120: const 36 ; append 125: getattr 126: load 1 1 129: call 0 131: call 1 133: pop 134: load 0 1 137: const 37 ; 1 142: add 143: store 0 1 146: jmp 101 151: const 38 ; nil 156: return
157: const 33 ; __init__ 162: const 39 ; x 167: const 40 ; y 172: const 41 ; r 177: define 0 0 2 2 277 186: load 0 0 189: load 0 1 192: gt 193: jz 214 198: self 199: const 41 ; r 204: getattr 205: load 0 0 208: load 0 1 211: tailcall 2 213: return
214: load 0 0 217: load 0 1 220: lt 221: jz 271 226: self 227: const 42 ; s 232: getattr 233: load 0 1 236: load 0 0 239: call 2 241: pop 242: load 0 0 245: const 37 ; 1 250: add 251: store 0 0 254: load 0 1 257: const 37 ; 1 262: sub 263: store 0 1 266: jmp 214 271: const 38 ; nil 276: return
277: const 41 ; r 282: const 39 ; x 287: const 40 ; y 292: const 42 ; s 297: define 0 0 2 3 362 306: self 307: const 34 ; a 312: getattr 313: load 0 0 316: getitem 317: store 0 2 320: self 321: const 34 ; a 326: getattr 327: load 0 1 330: getitem 331: self 332: const 34 ; a 337: getattr 338: load 0 0 341: setitem 342: load 0 2 345: self 346: const 34 ; a 351: getattr 352: load 0 1 355: setitem 356: const 38 ; nil 361: return
362: const 42 ; s 367: const 39 ; x 372: const 40 ; y 377: const 43 ; val 382: const 44 ; o 387: define 0 0 3 4 494 396: load 0 0 399: load 0 1 402: gt 403: jz 427 408: self 409: const 44 ; o 414: getattr 415: load 0 2 418: load 0 0 421: load 0 1 424: tailcall 3 426: return
427: load 0 0 430: store 0 3 433: load 0 3 436: load 0 1 439: le 440: jz 488 445: self 446: const 34 ; a 451: getattr 452: load 0 3 455: getitem 456: load 0 2 459: bxor 460: self 461: const 34 ; a 466: getattr 467: load 0 3 470: setitem 471: load 0 3 474: const 37 ; 1 479: add 480: store 0 3 483: jmp 433 488: const 38 ; nil 493: return
494: const 44 ; o 499: const 45 ; A 504: class 8 0 507: store 0 2 510: const 46 ; 200000 515: store 0 7 518: load 0 2 521: load 0 7 524: call 1 526: store 0 8 529: const 35 ; 0 534: store 0 9 537: load 0 9 540: load 0 7 543: const 47 ; 5 548: mul 549: lt 550: jz 727 555: load 0 1 558: call 0 560: const 48 ; 3 565: mod 566: store 0 10 569: load 0 1 572: call 0 574: load 0 7 577: mod 578: store 0 11 581: load 0 1 584: call 0 586: load 0 7 589: mod 590: store 0 12 593: load 0 10 596: const 35 ; 0 601: eq 602: jz 630 607: load 0 8 610: const 41 ; r 615: getattr 616: load 0 12 619: load 0 11 622: call 2 624: pop 625: jmp 710 630: load 0 10 633: const 37 ; 1 638: eq 639: jz 667 644: load 0 8 647: const 42 ; s 652: getattr 653: load 0 12 656: load 0 11 659: call 2 661: pop 662: jmp 710 667: load 0 10 670: const 49 ; 2 675: eq 676: jz 710 681: load 0 1 684: call 0 686: store 0 13 689: load 0 8 692: const 44 ; o 697: getattr 698: load 0 13 701: load 0 12 704: load 0 11 707: call 3 709: pop 710: load 0 9 713: const 37 ; 1 718: add 719: store 0 9 722: jmp 537
727: const 35 ; 0 732: store 0 14 735: const 35 ; 0 740: store 0 9 743: load 0 9 746: load 0 7 749: lt 750: jz 802 755: load 0 14 758: load 0 8 761: const 34 ; a 766: getattr 767: load 0 9 770: getitem 771: load 0 9 774: const 37 ; 1 779: add 780: mul 781: add 782: store 0 14 785: load 0 9 788: const 37 ; 1 793: add 794: store 0 9 797: jmp 743 802: const 23 ; <function 'print'> 807: const 50 ; hitcon{ 812: load 0 14 815: const 51 ; __string__ 820: getattr 821: call 0 823: add 824: const 52 ; } 829: add 830: call 1 832: pop
|
转化完后的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| var v0 = 68694329; def w(){ v0 = (v0 * 1259409 + 321625345) % 0x100000000; return v0; } class A{ def __init__(var n){ self.a = []; var i = 0; while (i < n){ self.a.append(w()); i += 1; } } def r(var x, var y){ if (x > y){ return self.r(y, x); } while (x < y) { self.s(x, y); x += 1; y -= 1; } } def s(var x, var y){ var tmp_a = self.a[x]; self.a[x] = self.a[y]; self.a[y] = tmp_a; } def o(var x, var y, var val){ if (x > y){ return self.o(y, x, val); } var i = x; while (i <= y){ self.a[i] = self.a[i] ^ val; i += 1; } } }
var v7 = 200000; var v8 = A(v7); var v9 = 0; var v10; var v11; var v12; var v13; while (v9 < v7 * 5){ v10 = w() % 3; v11 = w() % v7; v12 = w() % v7; if (v10 == 0){ v8.r(v11, v12); } else if (v10 == 1){ v8.s(v11, v12); } else if (v10 == 2){ v13 = w(); v8.o(v11, v12, v13); } v9 += 1; }
var v14 = 0; v9 = 0; while (v9 < v7){ v14 += v8.a[v9] * (v9 + 1); v9 += 1; }
print ("hitcon{" + v14.__string__() + "}")
|
解题c脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include<stdio.h> #include<string.h> unsigned int v0 = 68694329; unsigned int v8[500001]; unsigned int w(){ v0 = (v0 * 1259409 + 321625345) ; return v0; } void s(unsigned int x,unsigned int y){ unsigned int p; p=v8[x]; v8[x]=v8[y]; v8[y]=p; return ; } void r(unsigned int x,unsigned int y){ if(x>y){ r(y,x); return ; } while(x<y){ s(x,y); x++; y--; } return ; } void o(unsigned int x,unsigned int y,unsigned int val){ if(x>y){ o(y,x,val); return ; } unsigned int i=x; while(i<=y){ v8[i]^=val; i++; } return ; } int main(){ unsigned int v7=200000,v9=0; unsigned int v10,v11,v12,v13; for(int i=0;i<v7;i++){ v8[i]=w(); }
while(v9<v7*5){ v10=w()%3; v11=w()%v7; v12=w()%v7; if(v10==0){ r(v11,v12); } else if(v10==1){ s(v11,v12); } else if(v10==2){ v13=w(); o(v11,v12,v13); } v9++; } v9=0; for(int i=0;i<v7;i++){ printf("%u,\n",v8[i]); }
return 0; }
|
总结
我太菜了!