Layer7 19과제 -F.T.Z level 18 풀이-
와... 소스 코드가 엄청 길어서 한 화면에 담을 수도 없네요...
check 변수에 0xdeadbeef를 넣어주면 될거 같아요.
그럼 gdb로 뜯어보죠.
그전에는 못 본 레지스터가 나왔네요~!
data segment
프로그램 실행시에 사용되는 데이터가 여기에 들어갑니다. 여기서 말하는 데이터는 전역 변수입니다
프로그램 내에서 전역 변수를 선언하면 그 변수가 data segment에 자리 잡게 됩니다.
data segment는 다시 네 개의 data segment로 나뉘는데 각각 현재 모듈의 data struct,
상위 레벨로부터 받아들이느 데이터 모듈, 동적 생성 데이터, 다른 프로그램과 공유하는 공유 데이터가 있습니다.
esi: DS 레지스터가 가리키는 data segment 내의 어느 데이터를 가리키고 있는 포인터
문자열에서 source를 가리킴.
edi: ES 레지스터가 가리키고 있는 data segment 내의 어느 데이터를 가리키고 있는 포인터.
execl() 함수: 다른 프로그램을 실행하고 자신은 종료합니다.
처음에 할당을 100을 받아주네요.
변수가 char string[100]+check(4)+x(4)+count(4)+dummy+fd_set=256
그런데 우리가 지금까지 했던 것들과 많이 다른점이 있다.
뭐냐면 string 변수가 check 변수 보다 뒤에 있다는 점이다.
이렇게 되었을 경우 string 안에 인덱스에 -가 되면 된다.
그러니까 다시 말해 string 안에 배열에 -를 사용하여 반대로 접근해
0x080485ab <main+91>: cmp DWORD PTR [ebp-104],0xdeadbeef
check가 ebp-104의 위치의 있다.
104-100(string 변수부터 ebp까지의 거리)=4
이제 중요한 것은 코드를 보면 0x8의 값이 들어올 때 count의 값을 -1 시킨다.
swimming in pink