I recommend you to check if the 0x0804b795 address is writable.
You can see the different regions of a running process in /proc/PID/maps
. For example:
$ sleep 10 &
[1] 1438
$ cat /proc/$(pgrep -f 'sleep 10')/maps
08048000-0804d000 r-xp 00000000 08:01 399565 /bin/sleep
0804d000-0804e000 r--p 00005000 08:01 399565 /bin/sleep
0804e000-0804f000 rw-p 00006000 08:01 399565 /bin/sleep
084b4000-084d5000 rw-p 00000000 00:00 0 [heap]
[...]
In this case only the addresses between 0804e000-0804f000 and 084b4000-084d5000 are writable.
Inside GDB, you can use info proc
or info inferior
to get the PID of the debugged program.
Also, keep in mind that %n
will write an integer value, not a single character. I mean, in this case it will write 4 chars (in little-endian). But you can use %hhn
to write a single character.
I recommend you to read http://jbremer.org/format-string-vulnerabilities/ and to look at the documentation in printf(3)
documentation.