jericho@go-rangers:~/belajar C$ gdb -q ./saldo
Reading symbols from /home/jericho/belajar C/saldo...(no debugging symbols found)...done.
(gdb) set disassembly-flavor intel
(gdb) disassemble main
Dump of assembler code for function main:
0x08048444 <+0>: push ebp
0x08048445 <+1>: mov ebp,esp
0x08048447 <+3>: and esp,0xfffffff0
0x0804844a <+6>: sub esp,0x20
0x0804844d <+9>: mov DWORD PTR [esp+0x1c],0x8048570
0x08048455 <+17>: mov DWORD PTR [esp+0x18],0x3b9aca00
0x0804845d <+25>: mov eax,0x8048578
0x08048462 <+30>: mov DWORD PTR [esp],eax
0x08048465 <+33>: call 0x8048364 <printf@plt>
0x0804846a <+38>: mov eax,0x8048592
0x0804846f <+43>: lea edx,[esp+0x14]
0x08048473 <+47>: mov DWORD PTR [esp+0x4],edx
0x08048477 <+51>: mov DWORD PTR [esp],eax
0x0804847a <+54>: call 0x8048374 <__isoc99_scanf@plt>
0x0804847f <+59>: mov eax,DWORD PTR [esp+0x14]
0x08048483 <+63>: sub DWORD PTR [esp+0x18],eax
0x08048487 <+67>: mov eax,0x8048595
0x0804848c <+72>: mov edx,DWORD PTR [esp+0x18]
0x08048490 <+76>: mov DWORD PTR [esp+0x4],edx
0x08048494 <+80>: mov DWORD PTR [esp],eax
0x08048497 <+83>: call 0x8048364 <printf@plt>
0x0804849c <+88>: mov eax,0x0
0x080484a1 <+93>: leave
0x080484a2 <+94>: ret
End of assembler dump.
(gdb) x/s 0x8048570
0x8048570: "rahasia"
(gdb) p 1000000000-0x8048570
$1 = 865485968
(gdb)
jericho@go-rangers:~/belajar C$ ./saldo
Masukkan jumlah transfer:865485968
Saldo sekarang: rahasia
jericho@go-rangers:~/belajar C$ ./saldo
Masukkan jumlah transfer:865485967
Saldo sekarang: ahasia
jericho@go-rangers:~/belajar C$ ./saldo
Masukkan jumlah transfer:865485961
Saldo sekarang:
jericho@go-rangers:~/belajar C$ ./saldo
Masukkan jumlah transfer:865485960
Saldo sekarang: Masukkan jumlah transfer:
jericho@go-rangers:~/belajar C$
Perhatikan dengan mengurangkan jumlah transfer, didapatkan data rahasia tapi tidak lengkap, karena addressnya tidak dimulai dari awal string. bahkan pada saat nilai transfer 865485961, tidak muncul apa2 karena di posisi 1M-865485961, ditemukan NULL yang mengakhiri string "rahasia".
Tepat setelah nilai transfer 865485961, dikurangkan 1 menjadi 865485960, kita dapatkan string "Masukkan jumlah transfer:", yaitu parameter ketika memanggil printf().
Jadi jelas printf yang seperti itu akibatnya berbahaya, karna attacker bisa reading memory at arbitrary locations.