GREENIE라는 환경변수 설정하라고하네요.
값 암거나 주고 설정해도 결과에는 변함없었어요. 어셈을 봅시다.
Dump of assembler code for function main:
0x08048494 <main+0>: push ebp
0x08048495 <main+1>: mov ebp,esp
0x08048497 <main+3>: and esp,0xfffffff0
0x0804849a <main+6>: sub esp,0x60 //0x60byte 할당
0x0804849d <main+9>: mov DWORD PTR [esp],0x80485e0
//GREENIE 라는 문자열을 esp에
0x080484a4 <main+16>: call 0x804837c <getenv@plt> //getenv("GREENIE");
0x080484a9 <main+21>: mov DWORD PTR [esp+0x5c],eax
//있으면 eax에 환경변수 값이 들어감
getenv()는 대응하는 환경 변수가 있으면 그 환경 변수에 대한 값을 돌려주고 없으면 NULL을 리턴하는 함수네요.
음 그렇게해서 마지막 라인 실행하면 env_val = eax가 되겠군요.
0x080484ad <main+25>: cmp DWORD PTR [esp+0x5c],0x0
//리턴값이 널인지 검사
0x080484b2 <main+30>: jne 0x80484c8 <main+52> //널이면 그대로 진행
0x080484b4 <main+32>: mov DWORD PTR [esp+0x4],0x80485e8
0x080484bc <main+40>: mov DWORD PTR [esp],0x1
0x080484c3 <main+47>: call 0x80483bc <errx@plt>
//errx(1,"please set the GREENIE 어쩌고");
0x080484c8 <main+52>: mov DWORD PTR [esp+0x58],0x0
//esp+58(modified)에 0 넣음.
0x080484d0 <main+60>: mov eax,DWORD PTR [esp+0x5c]
//환경 변수 값을 eax에 옮김
0x080484d4 <main+64>: mov DWORD PTR [esp+0x4],eax
//그걸 또 esp+0x4에 옮김. 이건 strcpy의 인자2
여기까지하면 modified = 0, EAX랑 [ESP+0x4] = [env]이 되겠네요.
0x080484d8 <main+68>: lea eax,[esp+0x18]
0x080484dc <main+72>: mov DWORD PTR [esp],eax
0x080484df <main+75>: call 0x804839c <strcpy@plt>
//strcpy(buffer, env_val); 이런식일듯
0x080484e4 <main+80>: mov eax,DWORD PTR [esp+0x58]
0x080484e8 <main+84>: cmp eax,0xd0a0d0a
//esp+0x58(modified)이랑 0xd0a0d0a랑 비교함.
0x080484ed <main+89>: jne 0x80484fd <main+105> //다르면 점프
여기서 답이 나온듯 하네요. 버퍼 크기는 esp+0x18에서 0x58까지가 되겠네요 64byte!
그런데 비교하는게 modified 변수죠. 즉 0x58이니 더미+4바이트만 덮어씌우면 되겠군요!
더미를 64byte만큼해주고 \x0a\x0d\x0a\x0d를 써주면 분기를 안할거에요
0x080484ef <main+91>: mov DWORD PTR [esp],0x8048618
0x080484f6 <main+98>: call 0x80483cc <puts@plt> //바꿨다고 알려줌
0x080484fb <main+103>: jmp 0x8048512 <main+126>
0x080484fd <main+105>: mov edx,DWORD PTR [esp+0x58]
0x08048501 <main+109>: mov eax,0x8048641
0x08048506 <main+114>: mov DWORD PTR [esp+0x4],edx
0x0804850a <main+118>: mov DWORD PTR [esp],eax
0x0804850d <main+121>: call 0x80483ac <printf@plt>
//점프되면 try again 어쩌고저쩌고
0x08048512 <main+126>: leave
0x08048513 <main+127>: ret
End of assembler dump.
코드는 이렇게 생겼을듯 하네요
int main(){
int modified;
char buffer[64];
char* env_val;
env_val = getenv("GREENIE");
if(env_val == NULL){
errx(1,"plz set the greenie~");
}
modified = 0;
strcpy(buffer, env_val);
if(modified == 0x0a0d0a0d){
printf("you have correctly ~");
}
else{
printf("try again ~ %x",modified);
}
}