Skip to content

Instantly share code, notes, and snippets.

@mewmew
Forked from ceeac/subject.c
Created July 17, 2019 17:03
Show Gist options
  • Save mewmew/6e9b5b1de26b0db986d3f11759b15d7d to your computer and use it in GitHub Desktop.
Save mewmew/6e9b5b1de26b0db986d3f11759b15d7d to your computer and use it in GitHub Desktop.

Revisions

  1. @ceeac ceeac created this gist Jul 12, 2019.
    632 changes: 632 additions & 0 deletions subject.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,632 @@
    int main(int argc, char *argv[]);
    void basic_1_if(__size32 param1);
    void basic_2_if_else(__size32 param1);
    void basic_3_if_elseif(int param1);
    void basic_4_if_elseif_else(__size32 param1);
    void basic_5_head_controlled_loop(__size32 param1);
    void basic_6_tail_controlled_loop(__size32 param1);
    void basic_7_for_loop();
    void basic_8_forever_loop(__size32 param1);
    void basic_9_dead_block();
    void intermediate_1_short_circuit_and(int param1, int param2);
    void intermediate_2_short_circuit_or(int param1, int param2);
    void intermediate_10_loop_with_one_break(__size32 param1);
    void intermediate_11_loop_with_two_breaks(int param1);
    void intermediate_12_loop_with_break_and_block(__size32 param1);
    void intermediate_13_loop_with_one_continue(int param1);
    void intermediate_14_loop_with_two_continues(int param1);
    void intermediate_15_loop_with_continue_and_block(int param1);
    __size32 intermediate_16_loop_with_breaks_and_continues(__size32 param1);
    void intermediate_17_forever_loop_with_extra_statement();
    void intermediate_20_nested_loops(__size32 param1);
    void intermediate_30_switch_case(unsigned int param1);
    void advanced_1_loop_with_multiple_entries(int param1);
    void advanced_2_loop_with_multiple_exits(int param1);
    void advanced_10_irreducible(__size32 param1);
    void advanced_11_nested_loops_complex_condition(int param1);
    void advanced_12_nested_if_in_loop(__size32 param1);
    void advanced_20_jump_table_on_stack(unsigned int param1);
    void advanced_21_computed_jumps(unsigned int param1);


    /** address: 0x080483a0 */
    int main(int argc, char *argv[])
    {
    unsigned char al; // r8
    __size32 eax; // r24
    union { int; __size32 *; } ebp; // r29
    int ebx; // r27
    __size32 ecx; // r25
    unsigned int edi; // r31
    __size32 edx; // r26
    int esi; // r30
    union { int; __size32 *; } esp; // r28
    __size32 local5; // m[esp]

    basic_1_if(argc);
    basic_2_if_else(argc);
    basic_3_if_elseif(argc);
    basic_4_if_elseif_else(argc);
    basic_5_head_controlled_loop(argc);
    basic_6_tail_controlled_loop(argc);
    basic_7_for_loop();
    basic_8_forever_loop(argc);
    basic_9_dead_block();
    al = (argc > 4) ? 1 : 0;
    intermediate_1_short_circuit_and((al), ~argc & 0x1);
    intermediate_2_short_circuit_or((al), ~argc & 0x1);
    intermediate_10_loop_with_one_break(argc);
    intermediate_11_loop_with_two_breaks(argc);
    intermediate_12_loop_with_break_and_block(argc);
    intermediate_13_loop_with_one_continue(argc);
    intermediate_14_loop_with_two_continues(argc);
    intermediate_15_loop_with_continue_and_block(argc);
    eax = intermediate_16_loop_with_breaks_and_continues(argc); /* Warning: also results in ecx, edx */
    intermediate_17_forever_loop_with_extra_statement(al, eax, ecx, edx, argc, esp - 8, ~argc & 0x1, (al), SUBFLAGS32(argc, 4, argc - 4), argc == 4, (unsigned int)argc < 4, argc < 4, argc < 0 && argc >= 4, argc, argv, local5, ebp, edi, esi, ebx, esp + 4, argv, ~argc & 0x1, argc, pc);
    }

    /** address: 0x080485b0 */
    void basic_1_if(__size32 param1)
    {
    if (param1 == 42) {
    puts("if block");
    }
    return;
    }

    /** address: 0x080485e0 */
    void basic_2_if_else(__size32 param1)
    {
    if (param1 == 42) {
    puts("if block");
    }
    else {
    puts("else block");
    }
    return;
    }

    /** address: 0x08048620 */
    void basic_3_if_elseif(int param1)
    {
    if (param1 == 42) {
    puts("if block");
    }
    else {
    if (param1 == 43) {
    puts("else-if block");
    }
    }
    return;
    }

    /** address: 0x08048680 */
    void basic_4_if_elseif_else(__size32 param1)
    {
    if (param1 == 42) {
    puts("if block");
    }
    else {
    if (param1 == 43) {
    puts("else-if block");
    }
    else {
    puts("else block");
    }
    }
    return;
    }

    /** address: 0x08049110 */
    void basic_5_head_controlled_loop(__size32 param1)
    {
    __size32 ebx; // r27

    ebx = param1;
    puts("before");
    while (ebx != 42) {
    ebx++;
    puts("body");
    }
    puts("after");
    return;
    }

    /** address: 0x08049160 */
    void basic_6_tail_controlled_loop(__size32 param1)
    {
    __size32 ebx; // r27
    __size32 ebx_1; // r27{5}

    ebx = param1;
    puts("before");
    do {
    ebx_1 = ebx;
    ebx = ebx_1 + 1;
    puts("body");
    } while (ebx_1 + 1 != 42);
    puts("after");
    return;
    }

    /** address: 0x080486f0 */
    void basic_7_for_loop()
    {
    char ebx; // r27
    char ebx_1; // r27{2}
    char ebx_2; // r27{3}
    char local1; // ebx_1{2}

    ebx = '0';
    local1 = ebx;
    do {
    ebx_1 = local1;
    ebx_2 = ebx_1 + 1;
    local1 = ebx_2;
    putchar(ebx_1);
    } while (ebx_1 + 1 != 58);
    return;
    }

    /** address: 0x080491b0 */
    void basic_8_forever_loop(__size32 param1)
    {
    if (param1 == 42) {
    for(;;) {
    puts("loop body");
    }
    }
    return;
    }

    /** address: 0x080491d2 */
    void basic_9_dead_block()
    {
    puts("entry");
    puts("exit");
    return;
    }

    /** address: 0x08048720 */
    void intermediate_1_short_circuit_and(int param1, int param2)
    {
    int eax; // r24

    eax = rand();
    if (param1 != 0 && eax == param2) {
    puts("both true");
    }
    return;
    }

    /** address: 0x08048750 */
    void intermediate_2_short_circuit_or(int param1, int param2)
    {
    int eax; // r24

    eax = rand();
    if (param1 != 0 || eax == param2) {
    puts("at least one is true");
    }
    return;
    }

    /** address: 0x08048790 */
    void intermediate_10_loop_with_one_break(__size32 param1)
    {
    time_t eax; // r24

    for(;;) {
    puts("head");
    eax = time(0);
    if (eax == param1) {
    break;
    }
    puts("tail");
    }
    return;
    }

    /** address: 0x080487e0 */
    void intermediate_11_loop_with_two_breaks(int param1)
    {
    time_t eax; // r24
    int ebx; // r27
    int ebx_1; // r27{7}

    ebx = param1;
    if (param1 > 0) {
    do {
    ebx_1 = ebx;
    puts("head");
    eax = time(0);
    if (eax == ebx_1) {
    break;
    }
    puts("tail");
    ebx = ebx_1 - 1;
    } while (ebx_1 != 1);
    }
    return;
    }

    /** address: 0x08048830 */
    void intermediate_12_loop_with_break_and_block(__size32 param1)
    {
    int eax; // r24

    for(;;) {
    puts("head");
    eax = time(0);
    if (eax == param1) {
    break;
    }
    puts("barrier");
    eax = rand();
    if (param1 == eax) {
    return;
    }
    puts("tail");
    }
    puts("will break");
    return;
    }

    /** address: 0x080488a0 */
    void intermediate_13_loop_with_one_continue(int param1)
    {
    int eax; // r24

    if (param1 > 123) {
    for(;;) {
    puts("head");
    eax = time(0);
    if (param1 == eax) {
    continue;
    }
    puts("tail");
    }
    }
    return;
    }

    /** address: 0x080488f0 */
    void intermediate_14_loop_with_two_continues(int param1)
    {
    int eax; // r24

    if (param1 > 123) {
    for(;;) {
    puts("head");
    eax = time(0);
    if (param1 == eax) {
    continue;
    }
    puts("barrier");
    eax = rand();
    if (param1 == eax) {
    continue;
    }
    puts("tail");
    }
    }
    return;
    }

    /** address: 0x08048960 */
    void intermediate_15_loop_with_continue_and_block(int param1)
    {
    int eax; // r24

    if (param1 > 123) {
    for(;;) {
    bb0x8048970:
    puts("head");
    eax = time(0);
    if (param1 != eax) {
    puts("barrier");
    eax = rand();
    if (param1 == eax) {
    goto bb0x8048970;
    }
    puts("tail");
    goto bb0x8048970;
    }
    puts("will continue");
    }
    }
    return;
    }

    /** address: 0x080489e0 */
    __size32 intermediate_16_loop_with_breaks_and_continues(__size32 param1)
    {
    int eax; // r24
    int ecx; // r25
    int edx; // r26

    for(;;) {
    puts("head");
    eax = time(0);
    if (eax + 1 == param1) {
    continue;
    }
    puts("after first continue");
    eax = time(0); /* Warning: also results in ecx, edx */
    if (param1 == eax + 2) {
    break;
    }
    puts("after first break");
    eax = time(0);
    if (param1 == eax + 3) {
    continue;
    }
    puts("after second continue");
    eax = time(0); /* Warning: also results in ecx, edx */
    if (param1 == eax + 4) {
    break;
    }
    puts("after second break; tail");
    }
    return 0; /* WARNING: Also returning: ecx := ecx, edx := edx */
    }

    /** address: 0x08049211 */
    void intermediate_17_forever_loop_with_extra_statement()
    {
    bb0x8049214:
    goto bb0x8049214;
    }

    /** address: 0x08048aa0 */
    void intermediate_20_nested_loops(__size32 param1)
    {
    int eax; // r24

    puts("before");
    do {
    puts("outer loop");
    do {
    puts("inner loop");
    eax = time(0);
    } while (eax != param1);
    eax = rand();
    } while (param1 != eax);
    puts("after");
    return;
    }

    /** address: 0x08048b10 */
    void intermediate_30_switch_case(unsigned int param1)
    {
    if (param1 > 9) {
    puts("some other value");
    }
    else {
    switch(param1) {
    case 7:
    puts("7 with fall through");
    case 8:
    puts("8");
    break;
    case 9:
    puts("9");
    break;
    case 0:
    puts("0");
    break;
    case 1:
    puts("1");
    break;
    case 3:
    case 2:
    puts("2 or 3");
    break;
    case 4:
    puts("4");
    break;
    case 5:
    puts("5");
    break;
    case 6:
    puts("6");
    break;
    }
    }
    puts("common exit");
    return;
    }

    /** address: 0x08048c30 */
    void advanced_1_loop_with_multiple_entries(int param1)
    {
    int ebx; // r27
    int esp; // r28
    void *esp_1; // r28{3}
    void *esp_4; // r28{1}
    void *local1; // esp{8}
    void *local2; // esp{15}

    esp_1 = (esp_4 - 12);
    local2 = esp_1;
    local1 = esp_1;
    ebx = param1;
    if (param1 == 42) {
    ebx = 41;
    for(;;) {
    esp = local2;
    *(__size32*)(esp - 16) = 0x80493ce;
    puts(*(esp - 16));
    local1 = esp;
    if (ebx > 0) {
    do {
    bb0x8048c41:
    esp = local1;
    ebx--;
    *(__size32*)(esp - 16) = 0x80493c7;
    puts(*(esp - 16));
    local2 = esp;
    } while (ebx > 0);
    }
    return;
    }
    }
    else {
    if (param1 > 0) {
    goto bb0x8048c41;
    }
    }
    return;
    }

    /** address: 0x08048c80 */
    void advanced_2_loop_with_multiple_exits(int param1)
    {
    int eax; // r24
    int ebx; // r27
    int ebx_1; // r27{9}

    ebx = param1;
    if (param1 > 0) {
    do {
    ebx_1 = ebx;
    puts("body 1");
    eax = time(0);
    if (eax == 1) {
    puts("took exit 1");
    return;
    }
    puts("body 2");
    eax = time(0);
    if (eax == 2) {
    puts("took exit 2");
    return;
    }
    ebx = ebx_1 - 1;
    } while (ebx_1 != 1);
    bb0x8048cf0:
    puts("normal exit");
    }
    else {
    goto bb0x8048cf0;
    }
    return;
    }

    /** address: 0x08048d30 */
    void advanced_10_irreducible(__size32 param1)
    {
    int eax; // r24

    puts("b1");
    eax = time(0);
    if (eax == param1) {
    bb0x8048d78:
    puts("b3");
    }
    else {
    puts("b2");
    eax = time(0);
    if (eax == param1 + 1) {
    puts("b4");
    }
    else {
    goto bb0x8048d78;
    }
    }
    puts("b5");
    return;
    }

    /** address: 0x08048dc0 */
    void advanced_11_nested_loops_complex_condition(int param1)
    {
    int eax; // r24
    time_t eax_1; // r24{4}
    time_t eax_4; // r24{13}
    time_t eax_7; // r24{16}

    puts("b0");
    eax_1 = time(0);
    if (eax_1 == param1) {
    do {
    puts("b2");
    bb0x8048e31:
    puts("b3");
    eax_4 = time(0);
    if (eax_4 != eax_1 + 2) {
    eax = time(0);
    if (eax == eax_1 + 3) {
    goto bb0x8048e31;
    }
    goto bb0x8048de5;
    }
    puts("b1");
    eax_7 = time(0);
    } while (eax_7 == eax_1 + 1);
    }
    bb0x8048de5:
    puts("b9");
    return;
    }

    /** address: 0x08048e80 */
    void advanced_12_nested_if_in_loop(__size32 param1)
    {
    time_t eax; // r24

    puts("b0");
    do {
    bb0x8048ea0:
    puts("b1");
    eax = time(0);
    if (eax != param1) {
    puts("b3");
    eax = time(0);
    if (eax == param1 + 2) {
    goto bb0x8048ea0;
    }
    goto bb0x8048ee0;
    }
    puts("b2");
    eax = time(0);
    } while (eax == param1 + 1);
    bb0x8048ee0:
    puts("b4");
    return;
    }

    /** address: 0x08048f30 */
    void advanced_20_jump_table_on_stack(unsigned int param1)
    {
    int esp; // r28

    if (param1 <= 5) {
    /* goto m[(a[m[esp - 44]] + (param1 * 4)) + 8] */
    }
    puts("is something else");
    return;
    }

    /** address: 0x08049050 */
    void advanced_21_computed_jumps(unsigned int param1)
    {
    int eax; // r24

    puts("start");
    if (param1 > 2) {
    puts("is something else");
    }
    else {
    if (param1 != 0) {
    eax = 24;
    if (param1 == 2) {
    eax = 56;
    }
    /* goto eax + 0x8049098 */
    }
    puts("is 0");
    }
    return;
    }