NAME=x86_32
FILE=r2r/bins/elf/crackme0x05
EXPECT=<<EOF
x86:LE:32:default:gcc

undefined4 main(void)
{
    int32_t var_78h;
    
    sym.imp.printf("IOLI Crackme Level 0x05\n");
    sym.imp.printf("Password: ");
    sym.imp.scanf(0x80486b2, &var_78h);
    sym.check((int32_t)&var_78h);
    return 0;
}
EOF
CMDS=<<EOF
pdgss
s main
af
pdg
EOF
RUN

NAME=x86_64
FILE=r2r/bins/elf/hello_world
EXPECT=<<EOF
x86:LE:64:default:gcc

// WARNING: [r2ghidra] Detected overlap for variable var_1ch
// WARNING: [r2ghidra] Failed to find return address in ProtoModel

void main(void)
{
    int32_t iVar1;
    int32_t iVar2;
    int64_t iVar3;
    int64_t var_20h;
    int64_t var_18h;
    int64_t var_10h;
    int64_t var_8h;
    
    iVar1 = sym.imp.strlen(0x8d4);
    iVar2 = sym.imp.strlen(0x8da);
    iVar3 = sym.imp.malloc((int64_t)(iVar2 + iVar1 + 1));
    if (iVar3 != 0) {
        sym.imp.strcpy(iVar3, 0x8d4, 0x8d4);
        sym.imp.strcat(iVar3, 0x8da, 0x8da);
        sym.imp.puts(iVar3);
        sym.imp.free(iVar3);
    }
    return;
}
EOF
CMDS=<<EOF
pdgss
s main
af
pdg
EOF
RUN

NAME=6502
FILE=r2r/bins/prg/t01.prg
ARGS=-F prg
EXPECT=<<EOF
6502:LE:16:default:

// WARNING: [r2ghidra] Failed to match radare2 calling convention (null) to Decompiler ProtoModel
// WARNING: [r2ghidra] Failed to get address for var arg_101h
// WARNING: [r2ghidra] Failed to find return address in ProtoModel

void fcn.0000080e(void)
{
    undefined uVar1;
    uint8_t uVar2;
    
    uVar2 = 0xff;
    do {
        *(undefined *)((uint16_t)uVar2 + 0x3ff) = 0x41;
        uVar1 = *(undefined *)0x824;
        uVar2 = uVar2 - 1;
    } while (uVar2 != 0);
    uVar2 = 0xff;
    do {
        *(undefined *)((uint16_t)uVar2 + 0xd7ff) = uVar1;
        uVar2 = uVar2 - 1;
    } while (uVar2 != 0);
    return;
}
EOF
CMDS=<<EOF
pdgss
s 0x080e
af
pdg
EOF
RUN

NAME=code printing
FILE=r2r/bins/elf/crackme0x05
EXPECT=<<EOF

undefined4 main(void)
{
    int32_t var_78h;
    
    sym.imp.printf("IOLI Crackme Level 0x05\n");
    sym.imp.printf("Password: ");
    sym.imp.scanf(0x80486b2, &var_78h);
    sym.check((int32_t)&var_78h);
    return 0;
}
--
                  |
                  |undefined4 main(void)
                  |{
                  |    int32_t var_78h;
                  |    
    0x08048566    |    sym.imp.printf("IOLI Crackme Level 0x05\n");
    0x08048572    |    sym.imp.printf("Password: ");
    0x08048585    |    sym.imp.scanf(0x80486b2, &var_78h);
    0x0804858a    |    sym.check((int32_t)&var_78h);
    0x0804859b    |    return 0;
                  |}
--
CCu base64:Jg== @ 0x8048577
CCu base64:c3ltLmltcC5zY2FuZigweDgwNDg2YjIsICZ2YXJfNzhoKQ== @ 0x8048585
CCu base64:cmV0dXJuIDA= @ 0x804859b
CCu base64:c3ltLmNoZWNrKChpbnQzMl90KSZ2YXJfNzhoKQ== @ 0x8048590
CCu base64:c3ltLmltcC5wcmludGYoIklPTEkgQ3JhY2ttZSBMZXZlbCAweDA1XG4iKQ== @ 0x8048566
CCu base64:c3ltLmltcC5wcmludGYoIlBhc3N3b3JkOiAiKQ== @ 0x8048572
CCu base64:Jg== @ 0x804858a
--
<result><function><function name="main" size="92">
<addr space="ram" offset="0x8048540"/>
<localdb main="stack" lock="false">
<scope name="main">
<parent>
<val></val>
</parent>
<rangelist>
<range space="stack" first="0x4" last="0x1f7"/>
<range space="stack" first="0xffffff68" last="0xfffffffb"/>
</rangelist>
<symbollist>
<mapsym>
<addr space="stack" offset="0xffffff84"/><rangelist>
</rangelist>
</mapsym>
</symbollist>
</scope>
</localdb>
<ast>
<varnodes>
<addr space="const" offset="0x0" size="4" ref="0x140"/>
<addr space="const" offset="0x0" size="4" ref="0x15e"/>
<addr space="const" offset="0x804868e" size="4" ref="0x281"/>
<addr space="const" offset="0x80486a7" size="4" ref="0x282"/>
<addr space="const" offset="0x80486b2" size="4" ref="0x276"/>
<addr space="const" offset="0xffffff84" size="4" ref="0x27d"/>
<addr space="const" offset="0xffffff84" size="4" ref="0x27f"/>
<addr space="unique" offset="0x3a0" size="4" ref="0x113"/>
<addr space="unique" offset="0x3a0" size="4" ref="0x12d"/>
<addr space="unique" offset="0x10000047" size="4" ref="0x278"/>
<addr space="unique" offset="0x1000004b" size="4" ref="0x27b"/>
<addr space="unique" offset="0x10000057" size="4" ref="0x283"/>
<addr space="register" offset="0x0" size="4" ref="0x13f"/>
<addr space="register" offset="0x10" size="4" ref="0x1c9" unaff="true" input="true"/>
<addr space="ram" offset="0x8048394" size="8" ref="0x105"/>
<addr space="ram" offset="0x8048394" size="8" ref="0x112"/>
<addr space="ram" offset="0x8048374" size="8" ref="0x12c"/>
<addr space="ram" offset="0x80484c8" size="8" ref="0x13e"/>
</varnodes>
<block index="0">
<rangelist>
<range space="ram" first="0x8048540" last="0x804859b"/>
</rangelist>
<op code="1">
<seqnum space="ram" offset="0x8048566" uniq="0xc2"/>
<addr ref="0x278"/>
<addr ref="0x281"/>
</op>
<op code="7">
<seqnum space="ram" offset="0x8048566" uniq="0x5c"/>
<void/>
<addr ref="0x105"/>
<addr ref="0x278"/>
</op>
<op code="1">
<seqnum space="ram" offset="0x8048572" uniq="0xc3"/>
<addr ref="0x27b"/>
<addr ref="0x282"/>
</op>
<op code="7">
<seqnum space="ram" offset="0x8048572" uniq="0x61"/>
<void/>
<addr ref="0x112"/>
<addr ref="0x27b"/>
</op>
<op code="66">
<seqnum space="ram" offset="0x8048577" uniq="0xc4"/>
<addr ref="0x113"/>
<addr ref="0x1c9"/>
<addr ref="0x27d"/>
</op>
<op code="7">
<seqnum space="ram" offset="0x8048585" uniq="0x6b"/>
<void/>
<addr ref="0x12c"/>
<addr ref="0x276"/>
<addr ref="0x113"/>
</op>
<op code="66">
<seqnum space="ram" offset="0x804858a" uniq="0xc5"/>
<addr ref="0x12d"/>
<addr ref="0x1c9"/>
<addr ref="0x27f"/>
</op>
<op code="64">
<seqnum space="ram" offset="0x8048590" uniq="0xc6"/>
<addr ref="0x283"/>
<addr ref="0x12d"/>
</op>
<op code="7">
<seqnum space="ram" offset="0x8048590" uniq="0x72"/>
<void/>
<addr ref="0x13e"/>
<addr ref="0x283"/>
</op>
<op code="1">
<seqnum space="ram" offset="0x8048595" uniq="0x73"/>
<addr ref="0x13f"/>
<addr ref="0x140"/>
</op>
<op code="10">
<seqnum space="ram" offset="0x804859b" uniq="0x79"/>
<void/>
<addr ref="0x15e"/>
<addr ref="0x13f"/>
</op>
</block>
</ast>
 <prototype model="__cdecl" extrapop="4">
  <returnsym>
 </prototype>
</function>
--
<save_state loadersymbols="false">
<typegrp intsize="4" structalign="4" enumsize="4" enumsigned="false">
</typegrp>
<db>
<property_changepoint space="register" offset="0x1000" val="0x40000000"/>
<property_changepoint space="register" offset="0x100a" val="0x40000000"/>
<property_changepoint space="register" offset="0x1014" val="0x40000000"/>
<property_changepoint space="register" offset="0x101e" val="0x40000000"/>
<property_changepoint space="register" offset="0x1028" val="0x40000000"/>
<property_changepoint space="register" offset="0x1032" val="0x40000000"/>
<property_changepoint space="register" offset="0x103c" val="0x40000000"/>
<property_changepoint space="register" offset="0x1046" val="0x40000000"/>
<property_changepoint space="register" offset="0x1050" val="0x0"/>
<scope name="radare2-internal">
<parent>
</parent>
<rangelist>
</rangelist>
<symbollist>
<mapsym>
<function name="main" size="92">
<addr space="ram" offset="0x8048540"/>
<localdb main="stack" lock="false">
<scope name="main">
<parent>
<val></val>
</parent>
<rangelist>
<range space="stack" first="0x4" last="0x1f7"/>
<range space="stack" first="0xffffff68" last="0xfffffffb"/>
</rangelist>
<symbollist>
<mapsym>
<addr space="stack" offset="0xffffff84"/><rangelist>
</rangelist>
</mapsym>
</symbollist>
</scope>
</localdb>
 <prototype model="__cdecl" extrapop="4">
  <returnsym>
 </prototype>
</function>
<addr space="ram" offset="0x8048540"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="ram" offset="0x804868e"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="ram" offset="0x80486a7"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<function name="sym.check" size="1">
<addr space="ram" offset="0x80484c8"/>
<localdb main="stack" lock="false">
<scope name="sym.check">
<parent>
<val></val>
</parent>
<rangelist>
<range space="stack" first="0x4" last="0x1f7"/>
<range space="stack" first="0xfff0bdc0" last="0xffffffff"/>
</rangelist>
<symbollist>
<mapsym>
<addr space="stack" offset="0x4"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="stack" offset="0xfffffff4"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="stack" offset="0xfffffff0"/><rangelist>
</rangelist>
</mapsym>
</symbollist>
</scope>
</localdb>
 <prototype model="__cdecl" extrapop="4" modellock="true">
  <returnsym>
 </prototype>
</function>
<addr space="ram" offset="0x80484c8"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<function name="sym.imp.printf" size="1">
<addr space="ram" offset="0x8048394"/>
<localdb main="stack" lock="false">
<scope name="sym.imp.printf">
<parent>
<val></val>
</parent>
<rangelist>
<range space="stack" first="0x4" last="0x1f7"/>
<range space="stack" first="0xfff0bdc0" last="0xffffffff"/>
</rangelist>
</scope>
</localdb>
 <prototype model="__cdecl" extrapop="4">
  <returnsym>
 </prototype>
</function>
<addr space="ram" offset="0x8048394"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<function name="sym.imp.scanf" size="1">
<addr space="ram" offset="0x8048374"/>
<localdb main="stack" lock="false">
<scope name="sym.imp.scanf">
<parent>
<val></val>
</parent>
<rangelist>
<range space="stack" first="0x4" last="0x1f7"/>
<range space="stack" first="0xfff0bdc0" last="0xffffffff"/>
</rangelist>
</scope>
</localdb>
 <prototype model="__cdecl" extrapop="4">
  <returnsym>
 </prototype>
</function>
<addr space="ram" offset="0x8048374"/><rangelist>
</rangelist>
</mapsym>
</symbollist>
</scope>
</db>
<context_points>
<context_pointset space="ram" offset="0x0">
  <set name="addrsize" val="0x1"/>
  <set name="bit64" val="0x0"/>
  <set name="highseg" val="0x0"/>
  <set name="instrPhase" val="0x0"/>
  <set name="mandover" val="0x0"/>
  <set name="opprefx" val="0x0"/>
  <set name="opsize" val="0x1"/>
  <set name="prefix_66" val="0x0"/>
  <set name="prefix_f2" val="0x0"/>
  <set name="prefix_f3" val="0x0"/>
  <set name="repneprefx" val="0x0"/>
  <set name="repprefx" val="0x0"/>
  <set name="rexBprefix" val="0x0"/>
  <set name="rexRprefix" val="0x0"/>
  <set name="rexWprefix" val="0x0"/>
  <set name="rexXprefix" val="0x0"/>
  <set name="rexprefix" val="0x0"/>
  <set name="segover" val="0x0"/>
  <set name="suffix3D" val="0x0"/>
  <set name="vexL" val="0x0"/>
  <set name="vexMMMMM" val="0x0"/>
  <set name="vexMode" val="0x0"/>
  <set name="vexVVVV" val="0x0"/>
  <set name="vexVVVV_r64" val="0x0"/>
</context_pointset>
<context_pointset space="register" offset="0x0">
  <set name="addrsize" val="0x0"/>
  <set name="bit64" val="0x0"/>
  <set name="highseg" val="0x0"/>
  <set name="instrPhase" val="0x0"/>
  <set name="mandover" val="0x0"/>
  <set name="opprefx" val="0x0"/>
  <set name="opsize" val="0x0"/>
  <set name="prefix_66" val="0x0"/>
  <set name="prefix_f2" val="0x0"/>
  <set name="prefix_f3" val="0x0"/>
  <set name="repneprefx" val="0x0"/>
  <set name="repprefx" val="0x0"/>
  <set name="rexBprefix" val="0x0"/>
  <set name="rexRprefix" val="0x0"/>
  <set name="rexWprefix" val="0x0"/>
  <set name="rexXprefix" val="0x0"/>
  <set name="rexprefix" val="0x0"/>
  <set name="segover" val="0x0"/>
  <set name="suffix3D" val="0x0"/>
  <set name="vexL" val="0x0"/>
  <set name="vexMMMMM" val="0x0"/>
  <set name="vexMode" val="0x0"/>
  <set name="vexVVVV" val="0x0"/>
  <set name="vexVVVV_r64" val="0x0"/>
</context_pointset>
<tracked_pointset space="ram" offset="0x0">
  <set space="register" offset="0x20a" size="1" val="0x0"/>
</tracked_pointset>
</context_points>
<commentdb>
</commentdb>
</save_state>
--

[38;2;0;55;218mundefined4[0m [38;2;197;15;31mmain[0m([1;38;2;180;0;158mvoid[0m)
{
    [38;2;0;55;218mint32_t[0m [0mvar_78h[0m;
    
    [38;2;197;15;31msym.imp.printf[0m([38;2;193;156;0m"IOLI Crackme Level 0x05\n"[0m);
    [38;2;197;15;31msym.imp.printf[0m([38;2;193;156;0m"Password: "[0m);
    [38;2;197;15;31msym.imp.scanf[0m([38;2;193;156;0m0x80486b2[0m, &[0mvar_78h[0m);
    [38;2;197;15;31msym.check[0m(([38;2;0;55;218mint32_t[0m)&[0mvar_78h[0m);
    [1;38;2;180;0;158mreturn[0m [38;2;193;156;0m0[0m;
}
--
                  |
[38;2;0;55;218m[0m                  |[38;2;0;55;218mundefined4[0m [38;2;197;15;31mmain[0m([1;38;2;180;0;158mvoid[0m)
                  |{
                  |    [38;2;0;55;218mint32_t[0m [0mvar_78h[0m;
                  |    
    [38;2;19;161;14m0x08048566[0m    |    [38;2;197;15;31msym.imp.printf[0m([38;2;193;156;0m"IOLI Crackme Level 0x05\n"[0m);
    [38;2;19;161;14m0x08048572[0m    |    [38;2;197;15;31msym.imp.printf[0m([38;2;193;156;0m"Password: "[0m);
    [38;2;19;161;14m0x08048585[0m    |    [38;2;197;15;31msym.imp.scanf[0m([38;2;193;156;0m0x80486b2[0m, &[0mvar_78h[0m);
    [38;2;19;161;14m0x0804858a[0m    |    [38;2;197;15;31msym.check[0m(([38;2;0;55;218mint32_t[0m)&[0mvar_78h[0m);
    [38;2;19;161;14m0x0804859b[0m    |    [1;38;2;180;0;158mreturn[0m [38;2;193;156;0m0[0m;
                  |}
EOF
CMDS=<<EOF
s main
af
e scr.color=0
pdg
?e --
pdgo
?e --
pdg*
?e --
pdgx~!id=
?e --
pdgd~!id=,protectedMode
?e --
e scr.color=3
pdg
?e --
pdgo
EOF
RUN

NAME=pdgo align
FILE=r2r/bins/elf/hello_world
ARGS=-B 0x1000000000000000
EXPECT=<<EOF
                          |
                          |// WARNING: [r2ghidra] Detected overlap for variable var_1ch
                          |// WARNING: [r2ghidra] Failed to find return address in ProtoModel
                          |
                          |void main(void)
                          |{
                          |    int32_t iVar1;
                          |    int32_t iVar2;
                          |    int64_t iVar3;
                          |    int64_t var_20h;
                          |    int64_t var_18h;
                          |    int64_t var_10h;
                          |    int64_t var_8h;
                          |    
    0x10000000000007cf    |    iVar1 = sym.imp.strlen("Hello");
    0x10000000000007de    |    iVar2 = sym.imp.strlen(" r2-folks");
    0x10000000000007f6    |    iVar3 = sym.imp.malloc((int64_t)(iVar2 + iVar1 + 1));
    0x1000000000000804    |    if (iVar3 != 0) {
    0x1000000000000814    |        sym.imp.strcpy(iVar3, "Hello", "Hello");
    0x1000000000000827    |        sym.imp.strcat(iVar3, " r2-folks", " r2-folks");
    0x1000000000000833    |        sym.imp.puts(iVar3);
    0x100000000000083f    |        sym.imp.free(iVar3);
                          |    }
    0x1000000000000846    |    return;
                          |}
EOF
CMDS=<<EOF
s main
af
pdgo
EOF
RUN


NAME=rawptr
FILE=bins/dectest32
EXPECT=<<EOF

undefined4 sym.get_global_array_entry(void)
{
    return *(undefined4 *)0x804c020;
}
--

undefined4 sym.get_global_array_entry(void)
{
    return uRam0804c020;
}
EOF
CMDS=<<EOF
s sym.get_global_array_entry
af
e r2ghidra.rawptr=1
pdg
?e --
e r2ghidra.rawptr=0
pdg
EOF
RUN

NAME=global flag
FILE=bins/dectest32
EXPECT=<<EOF

undefined4 sym.get_global_var(void)
{
    return _obj.global_var;
}
--

// WARNING: Globals starting with '_' overlap smaller symbols at the same address

undefined4 sym.get_global_var(void)
{
    return _obj.global_var;
}
EOF
CMDS=<<EOF
s sym.get_global_var
af
e r2ghidra.rawptr=1
pdg
?e --
e r2ghidra.rawptr=0
pdg
EOF
RUN
