FTZ

Layer7 19과제 -F.T.Z level 18 풀이-

건_빵 2019. 7. 12. 00:07

와... 소스 코드가 엄청 길어서 한 화면에 담을 수도 없네요...

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