본문 바로가기

워게임/protostar

stack2

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);

}

}




'워게임 > protostar' 카테고리의 다른 글

stack5  (0) 2015.10.15
stack4  (0) 2015.10.15
stack3  (0) 2015.10.15
stack1  (0) 2015.10.15
stack0  (0) 2015.10.15