
안 열림

기드라 굿
int main(undefined8 param_1,undefined8 *param_2)
{
int iVar1;
long lVar2;
long in_FS_OFFSET;
int local_15c;
termios local_158;
long local_10;
local_10 = *(long *)(in_FS_OFFSET + 0x28);
local_15c = 0;
lVar2 = ptrace(PTRACE_TRACEME,0,1,0);
if (lVar2 == 0) {
local_15c = 2;
}
lVar2 = ptrace(PTRACE_TRACEME,0,1,0);
if (lVar2 == -1) {
local_15c = local_15c * 3;
}
if (local_15c == 6) {
RC4_set_key((RC4_KEY *)&stack0xfffffffffffffee8,0x32,key);
RC4((RC4_KEY *)&stack0xfffffffffffffee8,0x4e,(uchar *)&ptext,(uchar *)&ptext);
runPayload();
puts("Press any key to quit...");
tcgetattr(0,&local_158);
local_158.c_lflag = local_158.c_lflag & 0xfffffffd;
local_158.c_cc[6] = '\x01';
local_158.c_cc[5] = '\0';
tcsetattr(0,0,&local_158);
getchar();
iVar1 = 0;
}
else {
iVar1 = unlink((char *)*param_2);
}
if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return iVar1;
}
main을 보면 위와 같다.
local_15c를 6으로 만들면 뭔가 개많이 실행이 됨
근데 local_15c는 ptrace의 반환값인 lVar2 값에 의해 조정 가능
—–> ptrace 우회가 필요!!!
- ==을 !=으로 바꾸기

if를 누르면 그에 해당하는 어셈블리 코드가 좌측에 나옴

74를 75로 바꿔주면 JZ가 JNZ로 바뀜
- if부분을 통으로 0x90(NOP)으로 채우기

- 기드라 저장이 힘들어서 아이다로 어셈블함

저장하고 ubuntu에서 실행
일단 뭔가 runPayload까지 실행해보고 싶어서

해봤는데 바로 플래그가 나옴
…그치만 일단 설명을 해야하니까

runPayload() 함수를 보자 v1에 malloc으로 메모리를 할당하고 unpackPayload를 함
할당된 곳에 배열과 ptext값을 넣고 있음 + runPayload 하기 전 ptext는 RC4구문을 거침
- 어셈블로 ptrace bypass하기
- RC4로 돌린 ptext 구하고 저장된 배열 조립해서 result 구하기