인자로 받아들인 값을 주소값처럼 활용하나보네요
이런식으로 생겼어요
0x08048464 <main+0>: push ebp
0x08048465 <main+1>: mov ebp,esp
0x08048467 <main+3>: and esp,0xfffffff0
0x0804846a <main+6>: sub esp,0x60 //0x60byte 할당
0x0804846d <main+9>: cmp DWORD PTR [ebp+0x8],0x1 //첫번째 파라미터
0x08048471 <main+13>: jne 0x8048487 <main+35>
//0x1이랑 다르면 점프. 인자 없으면 0x1임
0x08048473 <main+15>: mov DWORD PTR [esp+0x4],0x80485a0
0x0804847b <main+23>: mov DWORD PTR [esp],0x1
0x08048482 <main+30>: call 0x8048388 <errx@plt>
0x08048487 <main+35>: mov DWORD PTR [esp+0x5c],0x0 //값이 다르면 esp+0x5c에 0 넣음
0x0804848f <main+43>: mov eax,DWORD PTR [ebp+0xc]
//ebp+0xc 값을 eax에 넣음
0x08048492 <main+46>: add eax,0x4 //왜인지 4 더함
0x08048495 <main+49>: mov eax,DWORD PTR [eax]
//그 값을 eax에 넣음. 이 eax가 유저가 입력한 값이 저장되는 주소..즉 argv[1]
0x08048497 <main+51>: mov DWORD PTR [esp+0x4],eax
//그걸 esp+0x4에 복사(인자 2)
0x0804849b <main+55>: lea eax,[esp+0x1c]
//이젠 버퍼가 저장된 공간임(인자 1)
0x0804849f <main+59>: mov DWORD PTR [esp],eax //그 값을 esp에 위치
0x080484a2 <main+62>: call 0x8048368 <strcpy@plt> //strcpy(buffer, argv[1])
0x080484a7 <main+67>: mov eax,DWORD PTR [esp+0x5c]
0x080484ab <main+71>: cmp eax,0x61626364 //eax랑 "dcba"랑 비교
0x080484b0 <main+76>: jne 0x80484c0 <main+92> //다르면 점프
0x080484b2 <main+78>: mov DWORD PTR [esp],0x80485bc
//you have correctly got the variable to the right value
0x080484b9 <main+85>: call 0x8048398 <puts@plt> //출력
0x080484be <main+90>: jmp 0x80484d5 <main+113>
0x080484c0 <main+92>: mov edx,DWORD PTR [esp+0x5c]
0x080484c4 <main+96>: mov eax,0x80485f3
0x080484c9 <main+101>: mov DWORD PTR [esp+0x4],edx
0x080484cd <main+105>: mov DWORD PTR [esp],eax
0x080484d0 <main+108>: call 0x8048378 <printf@plt>
0x080484d5 <main+113>: leave
0x080484d6 <main+114>: ret
0x40만큼 A입력하고 4byte를 dcba 입력하면 통과해요.
뭐 아마 소스코드는 대략
int main(){
char buffer[64]
int cmp;
if(argc == 1){
errx(1, "plz spectify 어쩌고");
}
int = 0;
strcpy(buffer, argv[1]);
if(cmp == "dcba"){
printf("you have 어쩌고");
}
else{
printf("try again 어쩌고");
}
}
일케 생겨먹었을것같네요