Вообще суть в том что мне необходимо узнать адресс начала стека для написания сплоитов Вот такая прога: unsigned long get_sp() { __asm__("movl %esp,%eax"); } void main() { printf("0x%x\n",get_sp()); } Дает неверные адреса(причем выдает не всегда один и тот же адрес) Я попробовал написать прогу на асме чтобы попытаться получить адрес esp: .text .globl _start _start: pushl %ebp movl %esp,%ebp movl %esp,var pushl $0x4 pushl $var pushl $1 pushl $0 movl $4,%eax lcall $0x7,$0x0 addl $16,%esp pushl $1 pushl $0 xorl %eax,%eax movl $1,%eax int $0x91 .data var: .long 0 Так вот прога выдает вот что bash-3.00$ ./h prbash-3.00$ Я смотрел доки по кодингу под никс на этом сайте, например такой код movl %esp,(var) сановским компилером не принимается(можно использовать и gnu as , но результат тот же) Похоже что esp не записывается в var, хотя вот такой код movl $0x41414141,%edx movl %edx,var выдает bash-3.00$ AAAAbash-3.00$ В чем загвоздка?
Вроде разобрался Я вызываю wirite() к-й не форматирует адреса, а нужно вызывать printf с форматом %x и также пихать туда адрес - тогда все правильно отображается Единственная странность - у меня переполнение буфера работает на разных адресах: bash-3.00$ ./slp2 Base:0x804721c Executing strcpy $ exit bash-3.00$ bash-3.00$ ./slp2 Base:0x8047338 Executing strcpy $ exit Почему так? и ведь адреса возврата разные , а вызываю я одну и туже уязвимую прогу с одинаковым буфером и шеллкодом