I want to reverse-engineer a Qt crackme written for linux. I would like to follow where introduced text gets. I have found this gdb
macro to print QStrings (Qt5). To test it I wrote a simple helloworld application containing:
QString str("almafa");
qDebug() << str;
This prints the QString as expected.
(gdb) printqs5static str
(Qt5 QString)0xffffdf50 length=6: "almafa"
After this I tried to inspect QStrings where no variable names are present.
The compiled code looks like (in radare2
):
| 0x00400ab7 488d45b0 leaq -0x50(%rbp), %rax
| 0x00400abb 488d55c0 leaq -0x40(%rbp), %rdx
| 0x00400abf 4889d6 movq %rdx, %rsi
| 0x00400ac2 4889c7 movq %rax, %rdi
| 0x00400ac5 e816feffff callq sym.QMessageLogger::debug
| 0x00400aca 488d55a0 leaq -0x60(%rbp), %rdx
| 0x00400ace 488d45b0 leaq -0x50(%rbp), %rax
| 0x00400ad2 4889d6 movq %rdx, %rsi
| 0x00400ad5 4889c7 movq %rax, %rdi
| 0x00400ad8 e863020000 callq sym.QDebug::operator__
I do not have experience debugging Qt applications, but I expected that from the above code snippet that at 0x400ad8
either rsi
or rdi
will be the QString. Unfortunately printqs5static $rsi
is not working. i r $rsi
gives 0x7ffffffdf50
, the address from printqs5static str
result.
The question is how to inspect QStrings when only memory addresses are available?
Edit: The web page I am referring is down at this moment, but a cashed version is here.
gdb
pretty printers are also able to print QStrings if there are symbolic names available. Still do not know how to work without them.